1

Java (任意のバージョン) 内のガベージ コレクションに関して、これら 2 つのコード ブロックは、いつ適格になるかに関して同等です。

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() が呼び出されると、メモリ内に新しいリストが作成され、ものが追加され、リストが返されます。返されたリストがどこかの変数に保存されていない限り、それはゴミです。メソッドはオブジェクトのインスタンス メソッドとして残りますが、返されたリスト オブジェクトはなくなりました。2 番目の例は、コンストラクターがメソッド go() を呼び出していないことを除いて、最初の例と同じことを行います。メソッドはオブジェクトのインスタンス メソッドとして引き続き存在しますが、リスト オブジェクトは作成されませんでした。したがって、最初の例がメソッド go() を終了すると、最初の例は、作成時の 2 番目の例と同じ休止状態になります。どちらも独自のメソッドでリストを作成して返す準備ができていますが、まだリストやメモリが割り当てられていません。最初の例のリストが実際にいつ収集されるかは、ガベージ コレクター次第ですが、ガベージとしてマークされています (例に表示されていないコードのどこかに変数に保存されていない限り)。

于 2012-09-11T01:50:32.663 に答える