01. interface Animal { void makeNoise(); }
02. class Horse implements Animal {
03. Long weight = 1200L;
04. public void makeNoise() { System.out.println("whinny"); }
05. }
06.
07. public class Icelandic extends Horse {
08. public void makeNoise() { System.out.println("vinny"); }
09. public static void main(String[] args) {
10. Icelandic i1 = new Icelandic();
11. Icelandic i2 = new Icelandic();
12. Icelandic i3 = new Icelandic();
13. i3 = i1; i1 = i2; i2 = null; i3 = i1;
14. }
15. }
直到第十四行,有多少对象可以被垃圾回收器回收java垃圾回收

解决方案 »

  1.   

    以下是个人理解:
    一共创建了3个对象
    第13行
    当执行完i3=i1;时,i3原先引用的对象已经变成“不可达”的了,会被gc回收
    执行完i1=i2;i2=null;时,i3引用一个对象,i1引用一个对象。没有对象被回收
    执行完i3=i1;时,i3上一次引用的对象变成“不可达”的,被gc回收
    现在只有一个对象未被回收,被i3和i1引用
    到第十四行,还没有出main函数,所以对象不会被自动回收所以又2个对象被回收
      

  2.   

    java垃圾回收是有jvm自动执行的,不是人为操作的,所以当不存在对某对象的任何引用时,该对象就处于被jvm回收的状态,并不是马上予以销毁。
    所以你判断一下有多少不存在对某个对象的任何引用,就知道结果了。。
    另外要注意的是垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身,这点很重要。
      

  3.   

    个人认为,到那块只有Icelandic i2 = new Icelandic();这句创建的对象被ic3,ic1引用,  另两个是可以被回收了.
      

  4.   

    4个对象。i1和i3都指向了11行创建的那个对象,i2为null。所以第十行和第十二行创建的那两个对象没有变量引用他们,所以可以回收。而且里面还有Long类型的对象可以被回收。一共四个。
      

  5.   

    这是一道OCJP认证考试的题目……答案是4个。表示压力巨大,无法理解。难道答案错了不成
      

  6.   

    为什么long对象可以被回收,而且听你的说法也只有三个呀。。
      

  7.   

    第十行和第十二行创建的那两个对象每一个里面都有Long,Long是个对象,又不是long,自然可以被回收。
      

  8.   

    Long也有缓存在[-128,127]之间,所以是四个,不然怎么解释,应该是这样子的,我说服我自己了
      

  9.   


    第十四行   是什么位置? main 即将结束,以后不会再有任何对物理地址的引用,所以,我说你直接问有多个对象就完了。 全部 都可以被回收