我一直试图理解这个问题,但无法解决书中提供的答案。有人可以向我解释吗?问题在下面。
class CardBoard {
Short story = 5;
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
}
}
当达到//做东西时,有多少对象可以进行垃圾回收?
给定的答案是2个对象。仅一个CardBoard对象(c1)是合格的,但它具有一个关联的Short wrapper对象,该对象也合格
我不明白为什么仅对象c1有资格进行垃圾回收。
创建两个对象,c1和c2。
对于对象c3,我们将c2传递给c1.go()方法。并将其设置为null并将返回的对象分配给c3。
在方法c1.go()中,将cb引用的对象设置为null(根据我的理解,该对象与c2引用的对象相同)。难道使c2引用的对象也可用于垃圾回收吗?
Java是按值传递的。当您执行操作时CardBoard c3 = c1.go(c2);
,将指向所指向的实例c2
,go()
但是在您执行操作的那一刻cb=null
,原始对象c2's cb
未设置为null
,则将新的空引用aconst_null
推入堆栈并返回。因此,只有2个对象(Short
和c1
)可以使用GC。
PS:正如Andreas所说,Short
将为-128到127之间的值缓存值,因此在您的情况下,Short
将重复使用同一实例。因此,只有一个对象才有资格使用GC。如果您的Short
值超出该范围,则2个对象将有资格使用GC。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句