public class Tank {
    private String state;
    public void fullFill(){
        state="full";
    }
    public void empty(){
        state="empty";
    }
    public void finalize(){
        if(state.equals("full"))
            System.out.println("Error: "+state);    
    }
    public static void main(String[] args){
        new Tank().fullFill();
        new Tank().empty();
        System.gc();
    }
}
此时运行结果为输出Error: full
若把main方法改为:
public static void main(String[] args){
        Tank t1=new Tank();
        t1.fullFill();
        Tank t2=new Tank();
        t2.empty();
        System.gc();
}则运行结果什么也不会输出,为什么两种情况会不一样呢,在垃圾回收之前不是先会调用finalize方法么?

解决方案 »

  1.   

    System.gc()只是回收垃圾对象,即没有被引用的对象。第一种情况下,new Tank()没有赋给任何变量,所以执行完以后就成为垃圾,是GC回收的对象。但第二种情况下,new Tank()被赋予变量,不是垃圾,GC不会去回收它们。除非在调用System.gc()之前,将所有指向该对象的变量设为null,如:
    t1 = null;
    t2 = null;这时两个对象才成为垃圾,才会被回收,finalize()方法才会被调用。