这个问题就像我之前的one 给出:
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行时,有多少对象符合垃圾收集器的条件?
一个。 0
B中。 1
℃。 2
d。 3
电子。 4
F。 6
我选择了A,但正确答案是E,但我不知道为什么?
答案 0 :(得分:8)
让我们将Icelandic
中创建的三个main
对象称为A
,B
和C
。
Initialy
i1=A
,i2=B
和i3=C
; i3 = i1
之后
i1=A
,i2=B
和i3=A
; i1 = i2
之后
i1=B
,i2=B
和i3=A
; i2 = null
之后:
i1=B
,i2=null
和i3=A
; i3 = i1
之后
i1=B
,i2=null
和i3=B
在第14行中,只有B
类Icelandic
对象的常设引用。正在运行的程序中丢失了A
和C
。
丢失的每个Icelandic
对象都会为垃圾收集器提供两个要收集的对象,即。 Icelandic
对象本身和每个Long
内的Icelandic
对象,这使得垃圾收集对象的总数 4 。
由于永远不会调用makeNoise
方法,因此它们不会改变结果。
答案 1 :(得分:2)
如果仔细观察,最后的所有作业i1
和i3
指向第二个对象,而i2
指向null
。这意味着两个Icelandic
个对象符合GC的条件。
每个Icelandic
对象包含一个Long
,这使得4个对象总共符合GC的条件。有趣的是,如果常量为12L
,则由于2
内部常量缓存,答案为:Long
。另请注意,"whinny"
和"vinny"
来自常量池,不会被垃圾回收。
一旦您离开宣传所有i1
,i2
和i3
的范围,剩下的两个对象也有资格获得GC。