我想进一步了解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的生命周期是如何工作的?
如果你能推荐一些关于这个主题的文档就好了。我相信我了解基本概念,但肯定需要深入研究。
1条答案
按热度按时间esyap4oy1#
对象和变量之间有很大的区别。
java是所有的指针,除了原语。不过,指针是一个有点脏的词,所以在java中这些被称为引用。波塔托——波塔托。
因此,在这方面:
这只是语法糖:
这个
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。