所以我的理解是在第1行,创建了一个新对象,它被obj引用。在第2行,obj引用另一个新对象。所以我们在第1行创建的对象有资格进行垃圾收集,因为它没有被任何实例引用。但测试问题的答案是第3行。原因?答案是否正确?
Object obj = new Object(); //line 1
obj = new Object(); //line 2
obj = null; //3
编辑:它询问第1行创建的对象何时可以进行垃圾回收。
答案 0 :(得分:0)
在现实世界中,这个问题(由标题提出)没有明确的答案。
我知道这应该是一个简单回答的学术问题,但是有很多假设可以让我可以为你提供任何你想要的答案。
即使我们不把任何兔子拉出帽子,答案仍然取决于是否在第X"指在执行
之前或之后答案 1 :(得分:-2)
垃圾收集器正在检查实时对象并丢弃任何不存在的对象。当您创建obj
时,您可以定义它的类型,因为这样可以让编译器知道为该地址分配多少空间,因为那里会存在Type Object
。当第二行执行时,new正在创建一个全新的对象实例,并且您将其地址分配给obj
。因此,在重新分配obj
以引用新对象之后,旧对象仍然存在,但不再被引用。它可能会被标记为集合,因为它占用堆中的空间,但不再处于活动状态。第3行也是如此,除非如前所述,您为其分配了null
的地址,并且没有创建新对象。因此,obj
过去引用的内容现在已经是死对象而垃圾人将它们带走了。