4

メソッド引数が渡されるJavaオブジェクトの寿命はどれくらいですか?

たとえば、私はオブジェクトテストを持っています

class Test{

    public string testType(){
       .....
    }
}

そして私は2つのクラスAとBを持っています

class classA{

   classB b = new classB();

   void nextQuestion{
      b.start(new Test());
   }
}




class classB{
   void start(Test test){
      doSomething(test.testType());
   }
}

では、テストオブジェクトの寿命はどのくらいですか?それはstartメソッドの終わりまでだけですか、それともclassBの終わりまで生きているのでしょうか、それともclassAの終わりまで生きているのか、それとも他の何かです。

4

3 に答える 3

6

メソッドはそこで宣言されており、それがそのスコープであるため、少なくともメソッドの最後まで残ります。start()その先、その存在はガベージコレクターの手に委ねられています。


編集:

つまり、そのメソッドが終了start()するまでは実行です。そして、あなたが示した変更を加えたとしても、それObjectはメソッドによってまだ必要とされているstart()ので、少なくともstart()メソッドの実行が終了するまでしか存在しません.それ以上はガベージコレクタに依存します.

于 2012-06-22T13:50:54.740 に答える
2

その寿命はnew Test()が呼び出されたときに始まり、メソッドが終了した後はいつでもガベージ コレクターによって解放されるstart可能性があります。これは、その時点以降は決して使用されないことがコンパイル時に証明できるためです。

startメソッドが (たとえば) オブジェクトを参照するように static フィールドを設定した場合、ガベージ コレクターはその参照が解放されるまでそれを収集できませんでした。

private static Test lastTested;
...

void start(Test test){
   lastTested = test;
   doSomething(test.testType());
}
于 2012-06-22T13:54:21.417 に答える
2

正確な有効期間はガベージ コレクターによって決定されます。オブジェクトへの参照がなくなると、GC によって再利用できます。ClassB.start()あなたの場合、そのメソッドが終了すると if への参照がなくなるため、少なくとも最後まで存続します

于 2012-06-22T13:54:51.407 に答える