0

次のような文字列を含むオブジェクトがあるとします。

class SomeObject  {
   private final String s;
   private final int i;

   SomeObject(String s, int i) {
      this.s = s;
      this.i = i;
   }

   String getString() {
      return s;
   }
}

したがって、たとえば、別のオブジェクトを作成するために使用し、他の可能なフィールドをSomeObject必要としないなど、参照を使用しない場合、それはガベージコレクションされますか?i

編集:明確でなくて申し訳ありません。問題は、someObject という名前の SomeObject インスタンスがあり、s 参照を getString() メソッド、つまり someObject.getString() でエスケープさせ、戻り参照を使用して、たとえば SomeObject インスタンスではない他のオブジェクトを構築するとします。 someObject はガベージ コレクションに使用できますか?

4

3 に答える 3

2

これを聞いてみましょう。

final class Foo {
  String value = "initial";
}

次のようにコードを実行するとします...

final Foo foo = new Foo();
final String val = foo.value;
foo.value = "replaced";

さて、あなたvalは今等しくなると思います"replaced"か?うまくいけば、そうではないでしょう。参照が何であるかについて誤解しているようです。を使用val = foo.valueすると、フィールドの値foo.valueval;にコピーします。値は、である文字列への参照です"initial"。フィールドへの参照ではありませんfoo.value。への参照を保持しても、ガベージコレクションが"initial"妨げられることはありません。foo

于 2012-09-01T20:36:28.040 に答える
2

私はあなたが言及していると思いますsか?はい、 のインスタンスはSomeObjectガベージ コレクションに対して無料です。は、元Stringの への参照を保持しませんSomeObject

于 2012-09-01T20:16:27.787 に答える
2

getString()を返しますsが、現在の から「削除」しませんSomeObject。値xが割り当てられている場合s

s = x;

xy新しい値を割り当てた場合にのみガベージコレクションされますs

s = y;

x左への参照はありません。

于 2012-09-01T20:26:55.437 に答える