- 简介
我们都知道,java有垃圾回收器专门负责回收无用对象占据的内存资源。所以我们一般不需要去清理没用的对象内存空间(类似于C++中的析构函数)。但是也有特殊情况,假设对象不是通过new得到的内存区域,那么垃圾回收器就不能回收该块内存。这是因为垃圾回收器只知道释放那些经由new分配的内存。为了应对这种情况java允许在类中定义finalize()方法。
那么finalize的原理是怎样的呢?刚才提到finalize()只负责一种特殊情况,即通过创建(new)对象方式以外的方式为对象分配存储空间。所以JVM保证在一个对象所占用的内存被回收之前,如果它实现了finalize方法,则将首先调用finalize()方法。Object默认finalize什么都不做。
下面有个finalize()的例子:
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");
}
}
}
public class TerminationCondition{
public static void main(String [] args){
Book novel=new Book(true);
novel.checkIn();
new Book(true);
System.gc();
}
}