考虑以下示例代码:
1. public class GC {
2. private Object o;
3. private void doSomethingElse(Object obj) { o = obj; }
4. public void doSomething() {
5. Object o = new Object();
6. doSomethingElse(o);
7. o = new Object();
8. doSomethingElse(null);
9. o = null;
10. }
11. }
调用doSomething方法时,在该行之后的一行中创建对象
5可用于垃圾收集吗?
A.5号线
B.6号线
C.第7行
D.第8行
E.第9行
F.10号线
答案:D
为什么是D?的确,当执行第6行时,实例var o和本地var o引用了在第5行中创建的对象,而当执行第8行时,现在仅由本地引用var o引用了对象,所以为什么回答是D,执行第9行后会发生什么??谢谢。
最佳答案
这个问题使IMO感到困惑的主要原因是有两个名为o
的变量。一个是实例变量o
,另一个是方法o
中的局部变量doSomething()
。
Time instance var o local var o
Before Line 5: null
Line 5: null Object#1
Line 6: Object#1 Object#1
Line 7: Object#1 Object#2
Line 8: null Object#2 <- No more references to Object#1
因此,在第8行(或在执行之后),对象#1有资格进行收集。