将实例变量设置为 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 并且我们有对该对象的引用如下:

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

此外,由于 ifoo 类型,因此它可以引用 foo 类型的对象,并且 this 也是 foo 类型的引用] 引用 foo 类型的对象。使 i 等于 this 使 i 也引用相同的对象。

希望这有助于消除您的疑虑。