考虑以下示例代码:
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可用于垃圾收集?
一个。第5行
B中。第6行
℃。第7行
d。第8行
电子。第9行
F。第10行
答案:D
为什么D?确实,当第6行被执行时,第5行中创建的对象现在被实例var o和本地var o引用,当第8行被执行时,对象现在只被本地引用引用,所以为什么要回答是D和第9行执行后会发生什么?感谢。答案 0 :(得分:9)
这个问题让IMO感到困惑的主要原因是有2个变量名为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有资格收集。
答案 1 :(得分:1)
这个问题有点令人困惑,因为在第二次调用第3行之后该对象符合条件,因为它清除了第二个引用o
。