考虑以下示例代码:

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有资格进行收集。

09-10 07:51
查看更多