finalize()有点象c++中的析构方法,但是在java中有垃圾回收的机制,所以这里有一点要
说明的finalize()方法在对象被当成垃圾从内存中释放的时候调用,也就是说当你的对象
被回收之前被调用,而不是你的对象一变成垃圾就被调用,所以finalize()的方法不一定
会被调用

解决方案 »

  1.   

    不要期望finalize()被系统调用,
    如果需要释放非内存类资源(如Socket链接,文件句柄等),可以放在一个自定义的方法中,如dispose(),同时需要显式的调用
      

  2.   

    public class Temp {
        public static int i=0;
        public Temp(){
            i++;
        }
        public void finalize(){
            i--;
        }
        public static void main(String[] args){
            Temp t1= new Temp();
            System.out.println(Temp.i);
            for (int n=0;n<100;n++){
                Temp t2 = new Temp();
                //t2.finalize();
            }
            //System.gc();
            System.out.println(Temp.i);
        }
    }正常情况运行一遍出结果
    1
    101把n循环改成10000次结果肯定不是
    1
    10001
    第二个数字是gc过一部分了的结果,虽然循环所创造的实例都出了作用域,但不是都被gc,gc都调用finalize取消gc的注释,结果就是
    1
    1
    因为所有都被gc,都调用了finalize再取消finalize的注释,结果是
    1
    -99
    因为调用finalize并不意味这个实例被gc,它被gc时还要被调用一次
      

  3.   

    但其实不能确保每个finalize都会被调用到