java中的finalize()问题

来源:百度知道 编辑:UC知道 时间:2024/06/07 10:53:46
class Book
{
boolean checkedOut=false;
Book(boolean checkOut)
{
checkedOut=checkOut;
}
void checkIn()
{
checkedOut=false;
}
@Override
protected void finalize()
{
if(checkedOut)
{
System.out.println("Error:checked out");
}
}
}

class TerminationCondition
{
public static void main(String[] args)
{

new Book(true);
System.gc();
/*这个时候可以打印出“Error:checked out",但如果把上面两行代码改写成
*Book n=new Book(true);
* System.gc();
* 这样就打印不出来了,不知道是什么原因?
**/

}
}

那你首先得知道finalize方法在什么条件下才会触发。

类似于C++中的析构函数,虚拟机在回收对象实例时,会调用该对象的finalize方法。
被注释掉的那部分代码,还存在对Book实例的引用n,所以Book实例不会回收。
没注释的那部分,new Book(true);构造完成后,该对象已无法引用,所以System.gc()后会被回收,并且触发其finalize方法。