垃圾收集器问题

Jav*_*yer 2 java garbage-collection scjp

这个问题就像是我以前的一个 假设:

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. }
Run Code Online (Sandbox Code Playgroud)

到达第14行时,有多少对象符合垃圾收集器的条件?

A. 0

B. 1

C. 2

D. 3

E. 4

F. 6

我选择了A,但正确答案是E,但我不知道为什么?

Tug*_*tes 8

让我们把三个Icelandic创建中的对象mainA,BC.

Initialy

  • i1=A,i2=Bi3=C;

i3 = i1

  • i1=A,i2=Bi3=A;

i1 = i2

  • i1=B,i2=Bi3=A;

之后i2 = null:

  • i1=B,i2=nulli3=A;

i3 = i1

  • i1=B,i2=nulli3=B

在第14行中,只有B类型对象的常设引用Icelandic.A并且C在正在运行的程序中丢失了.

Icelandic丢失的每个对象都会为垃圾收集器提供两个要收集的对象,即.所述Icelandic对象本身和Long内的每个对象Icelandic,这使垃圾收集的对象的总数4.

由于makeNoise从不调用方法,因此它们不会改变结果.

  • @Tomasz Nurkiewicz:这取决于`System.out.println`的实现. (2认同)