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. 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
执行到第7行时,原来指向第5行那个对象的引用指向了第7行的新对象,第5行的对象没有引用指向了,所以可以能被垃圾回收器回收了。
当方法调用到代码块结束是若为空的话就可能被回收了.
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行的对象没有引用指向了。
Object created in line 5 become available for garbage collection?
可译为:当doSomething方法被调用时,下面那一行使得第5行创建的对象可以被垃圾回收器(garbage collection)回收?我英语不太行,不过这个还是能看懂的。
因为obj指向了一个Null 的对象
原来的就没有被指向了 所以垃圾回收
原来的o已经指向了新的对象,虽然GC.o指向原来的o,但由于o = new Object();
那么这个原来的o也就毫无意义了,为了节约栈空间,是不是在这时就把o收回呢?也就是第7行,答案C。
第八行。也就是调用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;
}
}