java示例变量生命周期

vzgqcmou  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(430)

我想进一步了解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;
    }
}

当公共方法 process 当一个对象被调用时,一个局部变量c被创建。一旦此方法返回,c的生命周期就应该结束。但是,c的示例变量d现在被b引用,因此即使在 process 方法返回。一个对象有资格使用gc而不是它的示例变量吗?c及其示例变量d的生命周期是如何工作的?
如果你能推荐一些关于这个主题的文档就好了。我相信我了解基本概念,但肯定需要深入研究。

esyap4oy

esyap4oy1#

对象和变量之间有很大的区别。
java是所有的指针,除了原语。不过,指针是一个有点脏的词,所以在java中这些被称为引用。波塔托——波塔托。
因此,在这方面:

C c = getC();

这只是语法糖:

C c;
c = getC();

这个 c 变量是指针(引用)。就像一张小纸片,上面有藏宝图。它不是宝藏。
getc最终将运行: new C(new D()) . new java 语的意思是:从天而降召唤宝藏,埋葬它,还给我一张指向它的藏宝图。所以, new D() 会做宝藏,埋在沙子里,然后给你一张藏宝图(不是宝藏)。然后,藏宝图被传递给c。现在,“java都是通过值传递的,也就是说,只传递副本”开始有意义了:只有一个“d”宝藏。但是那张Map呢?那是复制的。Map便宜,小,而且一直都是复制的。
因此,c的构造器运行时,会有一个Map到您创建的新的d宝藏的副本,结果是一个c宝藏被创建并埋葬,现在您的c变量是一个宝藏Map,如果您遵循它,它会将您带到那个宝藏。
当你的方法结束时,那张藏宝图瞬间变成稀薄的空气。那宝藏呢?它一直在附近。一段时间。
有没有埋在沙子里的宝藏,那里再也没有藏宝图了?最终会被垃圾收集起来。
详细说明这种思考方式, . javaese的意思是:follow和dig。 foo.bar() 意思是:取名为 foo ,然后按照Map上的大x,然后,挖下来打开宝藏,然后对着它喊‘嘿,我给你发信息‘吧’,这会让宝藏做一些有趣的事情,想必吧。
尝试跟踪空白的藏宝图会导致nullpointerexception。

相关问题