2

この質問は私の前の質問のようなもの です

3. interface Animal { void makeNoise(); }
4. class Horse implements Animal {
5.   Long weight = 1200L;
6.   public void makeNoise() { System.out.println("whinny"); }
7.  }
8.  public class Icelandic extends Horse {
9.   public void makeNoise() { System.out.println("vinny"); }
10.  public static void main(String[] args) {
11.    Icelandic i1 = new Icelandic();
12.    Icelandic i2 = new Icelandic();
13.    Icelandic i3 = new Icelandic();
14.    i3 = i1; i1 = i2; i2 = null; i3 = i1;
15.  }
16. }

14 行目に到達したとき、ガベージ コレクタの対象となるオブジェクトはいくつありますか?

A.0

B.1

C.2

D.3

E.4

F.6

Aを選んだのに正解はEなのですが、わかりません なぜ?

4

2 に答える 2

8

Icelandicで作成した 3 つのオブジェクトmainA、 、Bと呼びましょうC

初期

  • i1=Ai2=Bおよびi3=C;

i3 = i1

  • i1=Ai2=Bおよびi3=A;

i1 = i2

  • i1=Bi2=Bおよびi3=A;

i2 = null:

  • i1=Bi2=nullおよびi3=A;

i3 = i1

  • i1=Bi2=nullおよびi3=B

B14 行目には、 type の objectのみへの参照が立っていますIcelandicA実行中のプログラムでC失われます。

失われた各Icelandicオブジェクトは、ガベージ コレクターに収集する 2 つのオブジェクトを与えます。Icelandicオブジェクト自体とLongevery 内のオブジェクト。Icelandicこれにより、ガベージ コレクションされたオブジェクトの総数は4になります。

makeNoiseメソッドは呼び出されないため、結果は変わりません。

于 2012-09-02T09:42:43.337 に答える
2

よく見ると、最後のすべての割り当ての後、i1と をi3指している間に 2 番目のオブジェクトをi2指していnullます。これは、2 つのIcelandicオブジェクトが GC の対象となることを意味します。

IcelandicオブジェクトにはLong、合計で 4 つのオブジェクトを GC の対象にするものが含まれています。興味深いことに、定数が の場合12L、答えは次のようになります:内部定数キャッシュ2が原因です。また、とはコンスタント プールからのものであり、ガベージ コレクトされないことにLongも注意してください。"whinny""vinny"

i1allとが宣言されているスコープを離れるi2i3、残りの 2 つのオブジェクトも GC の対象になります。

于 2012-09-02T09:35:22.543 に答える