1

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

我的问题如下:

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

4

1 回答 1

2

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

于 2012-09-11T01:50:32.663 回答