取自 SCJP 6 预备书 -
鉴于:
class CardBoard {
Short story = 200;
CardBoard go(CardBoard cb) {
cb = null;
return cb;
}
public static void main(String[] args) {
CardBoard c1 = new CardBoard();
CardBoard c2 = new CardBoard();
CardBoard c3 = c1.go(c2);
c1 = null;
// do Stuff
}
}
// 当达到 doStuff 时,有多少对象符合 GC 条件?
A. 0
B. 1
C. 2
D. 编译失败
E. 不可能知道
F. 运行时抛出异常
正确答案是 C -“只有一个 CardBoard 对象 (c1) 符合条件,但它有一个关联的 Short wrapper 对象也符合条件。”
我的问题是为什么 c3 没有资格收集?
我的想法是——
c1.go(c2) 将局部引用变量 cb(它是 c2 的副本)设置为 null,然后返回分配给 c3 的 cb。我知道c2本身的引用变量不能在方法中修改,只能修改它后面的对象。但是在我看来,引用变量 cb 的副本设置为 null 并分配给 c3。为什么在此实例中 c3 未设置为返回的 null?