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

解决方案 »

  1.   

    c,原因,第5行new出的对象只要有引用指向就不会成为垃圾回收的回收对象。
    执行到第7行时,原来指向第5行那个对象的引用指向了第7行的新对象,第5行的对象没有引用指向了,所以可以能被垃圾回收器回收了。
      

  2.   

    应该是第10行(F),好像在SCJP的考试见到过.
    当方法调用到代码块结束是若为空的话就可能被回收了.
      

  3.   

    1. public class GC { 
    2. private Object o;                        
    3. private void doSomethingElse(Object obj) { o = obj; }  //这里的O是GC类的私有成员
    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 中的局部变量o指向
    执行第6行调用了doSomethingElse时,把局变o值传给了obj参数,在doSomethingElse方法中,obj的值又赋给了GC的私有成员o,这时第五行的对象有三个引用指向它,分别是o,gc.o和obj
    doSomethingElse执行完后,obj被释放.现在只有o和gc.o指向了对象。
    第7行时,局变o指向了新的对象,这时,第5行的对象只有GC.o指向了
    第8行,调用doSomethingElse(null),null赋值给参数obj,obj的值null又赋值给了gc.o。这是第5行的对象没有引用指向了。
      

  4.   

    When the doSomething method is called, after which line does the 
    Object created in line 5 become available for garbage collection? 
    可译为:当doSomething方法被调用时,下面那一行使得第5行创建的对象可以被垃圾回收器(garbage collection)回收?我英语不太行,不过这个还是能看懂的。
      

  5.   

    是第8行垃圾回收
    因为obj指向了一个Null 的对象
    原来的就没有被指向了   所以垃圾回收
      

  6.   

    5楼说的很详细。不过有个问题:当第7行: o = new Object(); 
    原来的o已经指向了新的对象,虽然GC.o指向原来的o,但由于o = new Object(); 
    那么这个原来的o也就毫无意义了,为了节约栈空间,是不是在这时就把o收回呢?也就是第7行,答案C。
      

  7.   

    [color=#FF0000]
    第八行。也就是调用doSomethingElse(null)后,没有引用指向第五行创建的对象了, 给个测试代码package test;public class GC {
    private Person o;
    private void doSomethingElse(Person obj) {
    o = obj;
    }
    public void doSomething() {
    Person o = new Person("A");
    doSomethingElse(o);
    System.out.println(this.o);
    o = new Person("B");
    System.out.println(this.o);
    doSomethingElse(null);
    System.out.println(this.o);//这里打印是null
    o = null;
    }

    public static void main(String args[])
    {
    new GC().doSomething();
    }
    }class Person{
    String name;
    public Person(String name){
    this.name=name;
    }
    public String toString(){
    return name;
    }
    }