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。
我想了解更多关于 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。