此Java代码中有多少对象符合垃圾收集条件?
根据我正在读的书,这里的答案显然是2,但我仍然不明白为什么。它说在“//do stuff”行之后,2个对象将符合GC的条件
有人能一步一步地给我解释一下吗?在代码中的某一行之后,知道有多少对象符合垃圾收集的条件,这像是一个技巧吗?因为我们被告知这些类型的问题(有多少是gc可省略的)将出现在测试中
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
}
}
是的,答案是“2个对象在“//do stuff”行之后可以进行垃圾收集,但我仍然不明白为什么
在这张图片中,它也说明了为什么答案是2,但是解释让我更加困惑
Image from the SCJP book we're told to read.
它甚至不能解释其他物体发生了什么
编辑:
所以根据你们的说法,C1和C3符合GC的条件,我可以理解为什么,因为C1被设置为null和C1。GO(C2)将null返回到C3
但是根据这本书,只有C1是合格的,答案是2,因为包装很短。我不知道这是为什么,甚至不知道什么是短包装器对象
# 1 楼答案
我认为正确的答案实际上是只有一个对象符合“//do stuff”行之后的垃圾收集条件
在该代码中,只创建了两个对象,然后c1和c2引用它们。在“c1=null;”行之后一个对象立即成为GC的合格对象,尽管第二个对象仍然可以通过c2 ref访问
更新:
我遗漏了一个细节——每个调用
new CardBoard()
都会创建两个对象,因此调用c1 = null
会为GC创建一个合格的CardBoard和他的嵌套短成员# 2 楼答案
c2仍在引用硬纸板对象。c1被设置为null,当我们调用c1时,c3引用null。开始(c2)。 因此,它们(c1和c3)都不再在内存中引用,并且符合垃圾收集的条件
# 3 楼答案
我已经运行并调试了代码,我可以看到c1和c3是空的(出于明显的原因),而c2就是空的!=空
这是因为Java中的对象是通过值(explanation)传递的,在方法中设置c2=null不会导致原始c2设置为null