考虑这个示例代码:
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方法时,在哪一行之后创建的Object
5 可用于垃圾收集吗?
A、5号线
B、6号线
C、7号线
D、8号线
E、9号线
F、10号线
答案:D
为什么是D?确实,当执行第 6 行时,第 5 行中创建的对象现在由实例 var o 和本地 var o 引用,而当执行第 8 行时,该对象现在仅由本地 ref var o 引用,所以为什么答案是D,第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 行(或执行后),Object#1 符合收集条件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)