将实例变量设置为 class 本身的实例
Setting an instance variable to an instance of the class itself
我不知道如何表达这个问题,我不是在寻求帮助,我只是想知道为什么这是可能的。
假设我有一个 class foo:
public class foo {
private foo i = this;
public foo() {
...
}
}
为什么我可以将 i
设置为 class 本身的一个实例?
Java中的变量就像指针一样,它们实际上并不是对象,而是指向保存对象的存储。所以你创建了一个指针,指向你自己的对象。
让我们看看创建 foo
的对象时会发生什么。
foo x = new foo();
在遇到 new
时,JVM 将在堆中创建一个 foo
的对象。下一步(注意它的下一步)是构造函数执行。在 java 中,在堆上创建对象,然后调用构造函数。这就是即使构造函数抛出异常,即使创建了对象(可以在 finalize() 中回收)的原因。由于对象已经创建并存在于堆中 references 可以引用它。
this
是对对象的引用。
现在 private foo i = this;
作为构造函数的一部分执行(这是根据 java 行为,所有实例字段如果在声明的地方初始化,它会在调用构造函数时执行)。 this
已经引用了在堆上创建的对象,现在 i
也引用了堆上的同一个对象。一旦构造函数无一例外地成功执行,变量 x
也会引用堆上的同一个对象。
所以我们有 一个对象 of foo
并且我们有对该对象的引用如下:
this
(来自 foo
的实例方法)
- 我们有实例变量
i
- 我们有变量
x
作为对象的引用
此外,由于 i
是 foo
类型,因此它可以引用 foo
类型的对象,并且 this
也是 foo
类型的引用] 引用 foo
类型的对象。使 i
等于 this
使 i
也引用相同的对象。
希望这有助于消除您的疑虑。
我不知道如何表达这个问题,我不是在寻求帮助,我只是想知道为什么这是可能的。
假设我有一个 class foo:
public class foo {
private foo i = this;
public foo() {
...
}
}
为什么我可以将 i
设置为 class 本身的一个实例?
Java中的变量就像指针一样,它们实际上并不是对象,而是指向保存对象的存储。所以你创建了一个指针,指向你自己的对象。
让我们看看创建 foo
的对象时会发生什么。
foo x = new foo();
在遇到 new
时,JVM 将在堆中创建一个 foo
的对象。下一步(注意它的下一步)是构造函数执行。在 java 中,在堆上创建对象,然后调用构造函数。这就是即使构造函数抛出异常,即使创建了对象(可以在 finalize() 中回收)的原因。由于对象已经创建并存在于堆中 references 可以引用它。
this
是对对象的引用。
现在 private foo i = this;
作为构造函数的一部分执行(这是根据 java 行为,所有实例字段如果在声明的地方初始化,它会在调用构造函数时执行)。 this
已经引用了在堆上创建的对象,现在 i
也引用了堆上的同一个对象。一旦构造函数无一例外地成功执行,变量 x
也会引用堆上的同一个对象。
所以我们有 一个对象 of foo
并且我们有对该对象的引用如下:
this
(来自foo
的实例方法)- 我们有实例变量
i
- 我们有变量
x
作为对象的引用
此外,由于 i
是 foo
类型,因此它可以引用 foo
类型的对象,并且 this
也是 foo
类型的引用] 引用 foo
类型的对象。使 i
等于 this
使 i
也引用相同的对象。
希望这有助于消除您的疑虑。