当一个对象有资格使用垃圾收集器时?

Jav*_*yer 4 java garbage-collection scjp

考虑以下示例代码:

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. }
Run Code Online (Sandbox Code Playgroud)

当调用doSomething方法时,在第5行中创建的Object可用于垃圾收集之后是哪一行?

A.第5行

B.第6行

C.第7行

D.第8行

E.第9行

F.第10行

答案:D

为什么D?确实,当第6行被执行时,第5行中创建的对象现在被实例var o和本地var o引用,当第8行被执行时,对象现在只被本地引用引用,所以为什么要回答是D和第9行执行后会发生什么?谢谢.

Mik*_*ffe 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
Run Code Online (Sandbox Code Playgroud)

因此,在第8行(或执行后),对象#1有资格进行收集.