Java中垃圾收集的合格变量

我正准备 OCPJP,我被困在以下模拟考试问题:

鉴于:

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();
12.        Icelandic i3 = new Icelandic();
13.        i3 = i1; i1 = i2; i2 = null; i3 = i1;
14.    }
15. }

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

A. 0

B. 1

C. 2

D. 3

E. 4

F. 6

他们的正确答案是E,即四个物体,但我不确定为什么.从我的角度来看,i2及其重量将有资格进行垃圾收集.也许我错过了什么,请指教.

解决方法

让我们在第11行IceA,第12行IceB上调用Icelandic(),依此类推.

创作之后

i1 = IceA
i2 = IceB
i3 = IceC

在i3 = i1之后

i1 = IceA
i2 = IceB
i3 = IceA

在i1 = i2之后

i1 = IceB
i2 = IceB
i3 = IceA

在i2 = null之后

i1 = IceB
i2 = null
i3 = IceA

在i3 = i1之后

i1 = IceB
i2 = null
i3 = IceB

所以只剩下第12行创建的Icelandic().现在,每个Icelandic()都具有Long权重,因此IceA和IceC现在没有被引用,这意味着4个对象(IceA,IceA.weight,IceC,IceC.weight)可用于GC.

其他问题:

> args仍然是args,他们不计算这个问题超出范围>长权重不是静态声明的,因此类的每个实例都有一个权重对象.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...