关于题目是这样的
public class Tahiti {
Tahiti t;
public static void main(String args[]) {
Tahiti t = new Tahiti();
Tahiti t2 = t.go(t);
t2 = null
// more code here
}
Tahiti go(Tahiti t) {
Tahiti t1 = new Tahiti();
Tahiti t2 = new Tahiti();
t1.t = t2;
t2.t = t1;
t.t = t2;
return t1;
}
}
问题是执行到more code here 那的时候 有几个对象适合被垃圾回收
正确答案是零个 我就疑惑了 t1 t2 不是方法中声明的类么 方法结束了t2 = null之后还不回收么?的问题
看这里:
Tahiti t1 = new Tahiti();
Tahiti t2 = new Tahiti();
t1.t = t2;
t2.t = t1;
t.t = t2;
return t1;
这里有三个对象:t,t1,t2,t1和t2循环引用,t又引用了t2,并将t1返回,此时三个变量循环引用,
因此从方法go返回后,t1、t2由于循环引用,而且t2又被main中的t所引用,因此他们之间引用计数军大于0,不具备回收条件