4

考虑这个示例代码:

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 行中创建的 Object 在哪一行之后可用于垃圾回收?

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 行后会发生什么?谢谢。

4

2 回答 2

9

这个问题让 IMO 感到困惑的主要原因是有 2 个变量名为o. 一个是实例变量,另一个是方法内部o的局部变量。odoSomething()

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 符合收集条件。

于 2012-08-29T16:37:34.713 回答
1

这个问题有点令人困惑,因为它是在第二次调用第3 行o之后,该对象才符合条件,因为它清除了第二个引用。

于 2012-08-29T16:38:17.240 回答