Java实例变量生命周期

Java instance variable life cycle

我想了解更多关于 Java 实例变量生命周期的信息。考虑以下情况:

public class A {

    B b;

    public A(B b) {
        this.b = b;
    }

    public void process() {
        C c = getC();
        b.register(c.getD());
    }

    private C getC() {
        return new C(new D());
    }
}

public class B {
    List<D> dList;

    public B() {
        dList = new ArrayList<>();
    }

    public void register(D d) {
        dList.add(d);
    }
}

public class C {
    D d;

    public C(D d) {
        this.d = d;
    }

    public D getD() {
        return this.d;
    }
}

当调用A对象的public方法process时,会创建一个局部变量C。 c的生命周期应该结束一次这个方法returns。但是,c 的实例变量 D 现在被 b 引用,因此即使 process 方法 returns 也不应该对其进行垃圾回收。是否有可能一个对象有资格进行 GC 而不是它的实例变量? c 及其实例变量 d 的生命周期是如何工作的?

如果你能推荐一些关于这个主题的文档就好了。我相信我了解基本概念,但绝对需要更深入地研究。

对象和变量之间有很大的区别。

Java 是 所有 指针,除了基元。除了,指针是一个有点脏的词,所以在 java 中,它们被称为引用。 Potayto - potahto, though.

所以,在这个:

C c = getC();

这只是语法糖:

C c;
c = getC();

c变量是一个指针(引用)。它就像一张带有藏宝图的小纸片。 不是宝物

getC 将结束 运行ning: new C(new D()).

new 是 java-ese 的目的:从稀薄的空气中召唤出宝藏,埋葬它,然后 return 给我一张指向它的藏宝图。所以,new D()会制作宝藏,把它埋在沙子里,然后给你一张藏宝图(不是宝藏)。然后,藏宝图被传递给 C。现在 'java is all pass-by-value, i.e. only copies are passed' 开始有意义了:只有一个 'D' 宝藏。但是那张地图?那是抄的地图很便宜,很小,而且一直在复制。

因此,C 的构造函数是 运行 将地图的副本复制到您制作的新 D 宝藏,导致 C 宝藏已创建并埋藏,现在您的 C 变量是一张藏宝图如果你跟着它走,你就会找到那个宝藏。

当你的方法结束时,那张藏宝图瞬间化为乌有。那个宝物呢?那坚持。有一段时间了。

任何埋藏在沙子里的宝藏都没有藏宝图了?那最终将被垃圾收集。

为了详细说明这种思考方式,. 是 java 的意思:关注并挖掘。 foo.bar()的意思是:拿取名为foo的藏宝图,顺着地图走到上面的大X,然后,向下挖开宝藏,然后对着它大喊'hey, I send you the message "bar"',估计会让宝物做点有趣的事情吧。

尝试跟随一张空白藏宝图会导致 NullPointerException。