Java中的对象赋值和GC行为

时间:2016-07-27 07:17:49

标签: java garbage-collection

考虑下面的代码。对象objectOfA_In_B的最终值是什么?

Class A 
{
    // Some parameters and method with complicated logic goes here
}


Class B
{
    A objectOfA_In_B = new A();

    B()
    {
     // Operation done on objectOfA
    }

    public A getObjectA()
    {
        return objectOfA_In_B;
    }   
}


Class C
{
    public static void main(String[] args)
    {
        try
        {
            A objectOfA_In_C = null;
            B objectOfB = new B();

            objectOfA_In_C = B.getObjectA()

            // Rest of logic goes here
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            objectOfA_In_C = null;
        }
    }
}
通过objectOfA_In_B& #39;主要方法只是因为它们指向同一个对象?是否已准备好从垃圾收集器收集nullobjectOfA_In_C

3 个答案:

答案 0 :(得分:1)

这里有两个变量,只有一个对象。任何一个变量都可以指向对象。对变量的赋值对其他变量没有影响。当没有变量指向它时,对象(不是变量)已准备好进行垃圾收集。变量不能被垃圾收集,只有对象可以。

(因为这看起来像是家庭作业,所以我留下了一些结论,因为你想学习。:))

答案 1 :(得分:1)

由于您只将null分配给本地参考,因此它不会null。这不会改变任何可能指向该对象的引用。因此,objectOf_A_In_B不会受到影响,因此GC尚未准备好收集

答案 2 :(得分:1)

  

通过将objectOfA_In_C设置为null,objectOfA_In_B也将为null   最后阻止C的主要方法只是因为它们是指向   对同一个对象?

不,Java是值得传递的。甚至对象的引用都是按值传递的。因此,通过将objectOfA_In_C设置为nullobjectOfA_In_B将不会变为空。

  

是否已准备好收集objectOfA_In_C和objectOfA_In_B   来自垃圾收集器

此处只有一个A实例和2个引用它的引用(其中一个在null块中设置为finally。当没有引用指向它时,该实例将为GC做好准备。注意objectOfA_In_B仍然指向该实例。