finalize()有点象c++中的析构方法,但是在java中有垃圾回收的机制,所以这里有一点要
说明的finalize()方法在对象被当成垃圾从内存中释放的时候调用,也就是说当你的对象
被回收之前被调用,而不是你的对象一变成垃圾就被调用,所以finalize()的方法不一定
会被调用
说明的finalize()方法在对象被当成垃圾从内存中释放的时候调用,也就是说当你的对象
被回收之前被调用,而不是你的对象一变成垃圾就被调用,所以finalize()的方法不一定
会被调用
如果需要释放非内存类资源(如Socket链接,文件句柄等),可以放在一个自定义的方法中,如dispose(),同时需要显式的调用
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时还要被调用一次