/**
* 該類用于示範在對象的finalize()方法中複活對象(來自《實戰java虛拟機》-葛一鳴)
* 2017年4月4日 下午9:06:00
* @version v1.0
*/
public class CanReliveObj
{
public static CanReliveObj obj;
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("CanReliveObj finalize called !!!");
obj = this;//在finalize方法中複活對象
}
@Override
public String toString() {
return "I am canReliveObj";
}
public static void main(String[] args) throws InterruptedException {
obj = new CanReliveObj();
obj = null; //将obj設為null
System.gc();//垃圾回收
Thread.sleep();//
if(obj == null) {
System.out.println("obj is null");
} else {
System.out.println("obj is alive");
}
System.out.println("第2次調用gc後");
obj = null;//由于obj被複活,此處再次将obj設為null
System.gc();//再次gc
Thread.sleep();
if(obj == null) {
//對象的finalize方法僅僅會被調用一次,是以可以預見再次設定obj為null後,obj會被垃圾回收,該語句會被調用
System.out.println("obj is null");
} else {
System.out.println("obj is alive");
}
}
}
運作上述代碼後結果如下
CanReliveObj finalize called !!!
obj is alive
第次調用gc後
obj is null