我正准备
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,他们不计算这个问题超出范围>长权重不是静态声明的,因此类的每个实例都有一个权重对象.