1

私はJava認定書からいくつかの演習を行っています。ガベージ コレクションに関する質問では、次のコードが表示されます。

class Test {
   private Demo d;
   void start() {
      d = new Demo();
      this.takeDemo(d);
   }
   void takeDemo(Demo demo) {
      demo = null;
      demo = new Demo();
   }
}

そして質問は

4 行目で作成された Demo オブジェクトがガベージ コレクションの対象になるのはいつですか?

命令 demo=null; の後に収集できると思います。それへの参照がなくなったためですが、彼らが与える答えは次のとおりです。

このコードを実行しているインスタンスがガベージ コレクションの対象になったとき

私は何が欠けていますか?

4

6 に答える 6

5

Java は "pass-by-value"であるため、このステートメントはindemo = null;のローカル コピーにのみ影響します。に設定されていないため、外側のインスタンスに到達できる限り到達可能です。demotakeDemodnull

于 2013-02-08T12:26:31.847 に答える
1

demoが に設定されていることを正しく指摘しましたnull。しかし、dそうではありません。同じオブジェクトへの参照を引き続き保持します。したがって、答え。

于 2013-02-08T12:27:09.877 に答える
1

demo = nullメソッドに対してローカルなメソッド parameter の値を変更するだけdemoで、 field の値には影響しないためですd。Java では、すべてのメソッド パラメータが値で渡されることに注意してください。

于 2013-02-08T12:27:25.237 に答える
0

メソッドが終了するまで、ローカル変数への参照dは「アクティブ」です。start()その前に、ガベージ コレクションはそれを解放してはなりません。

于 2013-02-08T12:26:37.890 に答える
0

4 行目以降のデモは、Test インスタンスを組み合わせてのみ収集できます。または、もう一度 start メソッドを呼び出すと (古いデモが収集され、新しく作成されます)

takeDemo メソッドは、最初のデモには影響しません。しかし、それは 2 番目のデモを作成します。2 番目のデモは、takeDemo メソッドが終了した直後に収集できます。

于 2013-02-08T12:28:43.670 に答える
0

this.takeDemo(d); を呼び出すと、参照 d の値はパラメーター demo にコピーされるため、d と demo の両方が 4 行目で作成されたオブジェクトを参照します。変数 demo を null を指すように設定している場合でも、メソッド内で d はまだ参照を保持しているため、オブジェクトは次のようになります。テスト クラスのインスタンスがガベージ コレクションされると、ガベージ コレクションの対象になります。

于 2013-02-08T12:56:27.303 に答える