finalize:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下次垃圾回收动作发生时,才会
真正回收对象占用的内存,所以可用此作为对象终结条件的验证。
注意的三点:
1.对象可能不被垃圾回收
2.垃圾回收不等于“析构”
3.垃圾回收只与内存有关
示例代码:
public class Book {
boolean checkedOut =false;
Book(boolean checkOut){
checkedOut=checkOut;
}
void checkIn(){
checkedOut=false;
}
protected void finalize(){
if(checkedOut){
System.out.println("Error ,checked out");
try {
super.finalize();
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class TerminationConditon {
public static void main(String[] args) {
Book novel = new Book(true);
novel.checkIn();
new Book(true);
System.gc();//输出:Error ,checked out
//System.gc()属于强制进行终结动作。即使不这样做,通过重复执行程序导致大量内存被占用也会引起垃圾回收动作的执行。
}
}
本例的终结条件是所有的book在被当做垃圾回收前都应该checkIn,但由于main方法的错误,有一本书未被checkIn,可以用finalize来验证终结条件。