垃圾收集模拟OCPJP考试

blu*_*sky 1 java ocpjp

i3 = null;在下面显示的类中执行时,有四个对象符合垃圾回收的条件.我添加了评论来解释我是如何得到这个答案的.我的推理是否正确?

public class Icelandic extends Horse{
    public void makeNoise(){
        System.out.println("vinny");
    }

    public static void main(String args[]){
        /**
         * 2 objects created
         */
        Icelandic i1 = new Icelandic();

        /**
         * 2 objects created
         */
        Icelandic i2 = new Icelandic();

        /**
         * 2 objects created
         */
        Icelandic i3 = new Icelandic();

        /**
         * i3 is now pointing at i1, original Icelandic() referred to by i3 now
             * has no reference -  2 objects now have no reference
         */
        i3 = i1;

        /**
         * i3 is now pointing at i1, original Icelandic() referred to by i1 now
             * has no reference -  2 objects now have no reference
         */
        i1 = i2;

        /**
         * Total of six objects created, 4 objects no longer have a reference so 4
             * can be garbage collected.
         * 
         * Setting to null below doesn't make any difference to garbage collector
             * as objects now do not have a reference
         */
        i2 = null;
        i3 = null;
    }
}

interface Animal {
    void makeNoise();
}

class Horse implements Animal{
    Long weight = 1200L;

    public void makeNoise() {
        System.out.println("whinny");
    }    
}
Run Code Online (Sandbox Code Playgroud)

pra*_*p19 12

这些是您的计划的步骤:

    Icelandic i1 = new Icelandic();
    Icelandic i2 = new Icelandic();
    Icelandic i3 = new Icelandic();
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

    i3 = i1;
    i1 = i2;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

    i2 = null;
    i3 = null;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

因此,最后一个图表得出结论,只有2个对象可以进行垃圾回收.我希望我很清楚.您可以将对象名称视为对象的引用.

编辑:

正如BalusC所说,长重= 1200L也是对象.因此,i1和i3各有2个对象是合格的或垃圾收集.所以在所有4个对象都符合条件或垃圾回收.

  • 优秀的演示.但是我认为你必须考虑到"长重= 1200L",并且似乎SCJP问题中所述的*实际*答案是4有资格获得GC. (4认同)