根据构造函数中函数的调用来确定对象的合格性



就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;
        }  
    } 

我的问题如下:

从构造函数调用的函数是否会导致垃圾收集器忽略该函数范围内的任何对象(如果这些对象是从构造函数调用)?

在第一个类中,从构造函数调用go()。在调用代码行:go()之前,该对象除了被实例化到的变量所指向的内存中的空间外,什么都不存在。在调用go()时,将在内存中创建一个新列表,添加内容并返回列表。除非返回的列表被保存到某个变量中,否则它就是垃圾。该方法仍然是对象的实例方法,但返回的列表对象现在不见了。除了构造函数没有调用方法go()之外,您的第二个示例与第一个示例执行相同的操作。该方法仍然作为对象的实例方法存在,但从未创建列表对象。因此,一旦第一个例子退出方法go(),第一个例子就处于与第二个例子创建时相同的静止状态。两者都准备好用自己的方法创建和返回列表,但都没有分配列表或内存。当第一个示例中的列表将被实际收集时,这取决于垃圾收集器,但它已被标记为垃圾(除非保存到示例中未看到的代码中的某个变量中)。

最新更新