我不知道如何表达这个问题,我也不寻求帮助,我只是好奇为什么这是可能的。
说我有一个foo类:
public class foo {
private foo i = this;
public foo() {
...
}
}
为什么我可以将i
设置为类本身的实例?
答案 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
,并且我们对该对象的引用如下:
this
(来自foo
的实例方法中)i
x
作为对该对象的引用由于i
的类型为foo
,因此它可以引用类型为foo
的对象,并且this
也是类型为foo
的引用到类型foo
的对象。使i
等于this
会使i
也指向同一对象。
希望这有助于清除您的疑问。