将实例变量设置为类本身的实例

时间:2018-08-22 12:43:45

标签: java variables this instance

我不知道如何表达这个问题,我也不寻求帮助,我只是好奇为什么这是可能的。

说我有一个foo类:

public class foo {

    private foo i = this;

    public foo() {
        ...
    }
}

为什么我可以将i设置为类本身的实例?

2 个答案:

答案 0 :(得分:1)

Java中的变量就像指针,它们实际上不是对象,而是指向保存对象的存储。因此,您将创建一个指向您自己的对象的指针。

答案 1 :(得分:0)

让我们看看创建foo的对象时会发生什么。

foo x = new foo();

遇到new时,JVM将在堆中创建foo的对象。下一步(请注意其下一步)是构造函数执行。在java中,在堆上创建对象,然后调用构造函数。这就是即使构造函数引发异常,甚至创建对象(可以在finalize()中回收)的原因。由于对象已经创建并且存在于堆中,因此引用可以引用该对象。 this是对对象的引用。

现在private foo i = this;作为构造函数的一部分执行(这是根据java的行为,所有实例字段如果在声明的位置初始化,则在构造函数被调用时执行)。 this已经引用了在堆上创建的对象,现在i也引用了在堆上的同一对象。一旦构造函数成功执行,没有任何异常,变量x也会引用堆上的同一对象。

因此,我们有{strong> 1个对象,foo,并且我们对该对象的引用如下:

  1. this(来自foo的实例方法中)
  2. 我们有实例变量i
  3. 并且我们有变量x作为对该对象的引用

由于i的类型为foo,因此它可以引用类型为foo的对象,并且this也是类型为foo的引用到类型foo的对象。使i等于this会使i也指向同一对象。

希望这有助于清除您的疑问。