Question 212
Given:
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. }
When the doSomething method is called, after which line does the
Object created in line 5 become available for garbage collection?
A. Line 5
B. Line 6
C. Line 7
D. Line 8
E. Line 9
F. Line 10
Answer: D我自己是这样想的:
在Line9处,仍然有O被使用,虽然是赋值为null的操作,但还是在使用啊,所以选择E。答案为什么会是D呢??谢谢

解决方案 »

  1.   

    虽然被赋值为null,但是仍然持有引用,当本方法结束时才被回收
      

  2.   

    因为
    doSomethingElse(null);
    这里已经让它为空了
      

  3.   

    public class GC {
    private Object o; private void doSomethingElse(Object obj) {
    o = obj;
    } public void doSomething() {
    //为了方便,把下面这句new出来的对象叫M
    Object o = new Object();  //执行完这句,M被o引用着
    doSomethingElse(o);//执行完这句,M被成员变量o和局部变量引用着
    o = new Object();  //执行完这句,M被成员变量o引用着,局部变量不再引用o
    doSomethingElse(null);//执行完这句,成员变量o指向null,M没有被谁引用,所以答案就是D了
    o = null;
    }
    }
      

  4.   

    Line 7过后,Line 7 把o重新指向新的地址,已经不是Line5的o了,原来的Line 5建立的O已经没有被任何对象引用,有效引用为0
      

  5.   

    这个对,楼上,你忘了看成员变量o和doSomethingElse方法