0

我不确定我是否完全理解了垃圾收集器的行为,因此我根据上一个问题提出这个问题

在这个程序中:

class A {
    Boolean b;
    A easyMethod(A a){
       return new A();
    }
    public static void main(String [] args){
        A a1 = new A();
        A a2 = new A();
        A a3 = new A();
        a3 = a1.easyMethod(a2);
        a1 = null;
        // Some other code 
    }
} 

有多少对象有资格进行垃圾收集?我认为虽然a3永远不会变为 null,但new A()分配给它的第一个对象 ( ) 也应该被垃圾回收,因为没有引用仍然指向它。我对吗?因此,我认为正确的答案将再次是 2 个对象。实际上什么是真的?

4

2 回答 2

2

我认为虽然a3永远不会变为 null,但new A()分配给它的第一个对象 ( ) 也应该被垃圾回收,因为没有引用仍然指向它。我对吗?因此,我认为正确的答案将再次是 2 个对象。

是的,这完全正确。a3最初指向 的一个实例A,但是在将该变量重新分配为指向不同的实例之后,不再有任何方法可以到达原始实例,因此该原始实例有资格进行垃圾回收。

于 2012-11-13T22:03:28.833 回答
2

是的你是对的。

a1 = <instance 1>
a2 = <instance 2>
a3 = <instance 3>
a3 = <instance 4> //as a returned value
a1 = null

所以instance 1instance 3不再被引用,因此可以被收集。

于 2012-11-13T22:06:33.987 回答