基于构造函数中的函数调用确定对象的合格性

时间:2012-09-11 01:41:37

标签: java garbage-collection

在Java(任何版本)中的垃圾收集方面,这两个代码块等同于它们何时符合条件:

public class Foo  
{  

    public Foo()  
    {  
        go();   
    }  

   public List go()  
    {  
       List things = new List();  
        things.add(42);  
        things.add(new Object());
        return things;
    }  
} 

以及以下内容:

public class Foo  
    {   
        public Foo()  
        {     
        }  

        public List go()  
        {  
           List things = new List();  
            things.add(42);  
            things.add(new Object());
            return things;
        }  
    } 

我的问题如下:

从构造函数调用的函数是否会导致垃圾收集器忽略在该函数中作用域的任何对象(如果从构造函数调用它们)?

1 个答案:

答案 0 :(得分:2)

在你的第一堂课中,从构造函数中调用go()。在调用代码行:go()之前,该对象不存在任何内容,但内存中的空间由对象实例化的变量指向。在调用go()时,会在内存中创建一个新列表,添加内容并返回列表。除非返回的列表保存到某个地方的变量,否则它就是垃圾。该方法仍然是对象的实例方法,但返回的列表对象现在已经消失。 你的第二个例子与第一个例子做同样的事情,除了构造函数没有调用方法go()。该方法仍然作为对象的实例方法存在,但从未创建列表对象。 因此,一旦第一个示例退出方法go(),第一个示例处于与创建时第二个示例相同的休息状态。两者都准备用自己的方法创建和返回一个列表,但是没有一个已分配的列表或内存。由垃圾收集器决定第一个例子中的列表是否会被实际收集,但它已被标记为垃圾(除非保存到代码中未见的代码中的某个变量)。