我正准备参加OCJP考试。我正在进行模拟测试。这是一段代码片段。
public class GC {
private Object o;
private void doSomethingElse(Object obj) {
o = obj;
}
public void doSomething() {
Object obj = new Object(); // Line 5
doSomethingElse(obj); // Line 6
obj = new Object(); // Line 7
doSomethingElse(null); // Line 8
obj = null; // Line 9
}
}
当调用doSomething方法时,Object obj在哪个行之后可用于垃圾回收?
我知道答案是第9行,但根据考试模拟器它是第8行?我不确定谁是对的?
答案 0 :(得分:6)
模拟器是对的。在第7行中,您将覆盖对实例的本地硬引用,因此第9行中的代码使第二个Object
符合GC条件。第一个符合第8行的条件。
更长的解释:
第5行:创建inst1
并分配给obj
第6行:将inst1
放入this.o
。现在有两个对inst1
的硬性引用
第7行:创建inst2
并分配给obj
。 this.o
仍然指向inst1
第8行:清除参考this.o
,使inst1
可用于GC
第9行:清除参考obj
,使inst2
可用于GC
答案 1 :(得分:1)
第5行创建的对象在第8行之后有资格进行垃圾回收,而在第7行创建的对象有资格在第9行进行垃圾回收。