package com.zaki.mytest;
public class FinalizeTest {
public static Object reLiveObj;
public static void main(String[] args){
reLiveObj = new FinalizeTest();
System.out.println("-------第一次调用gc--------");
reLiveObj = null;
System.out.println("gc前的reLiveObj:" + reLiveObj);
System.gc();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(reLiveObj);
System.out.println("-------再次调用gc--------");
reLiveObj = null;
System.gc();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(reLiveObj);
}
protected void finalize(){
System.out.println("Animal--finalize");
reLiveObj = this;
}
}
运行结果:
-------第一次调用gc--------
gc前的reLiveObj:null
Animal--finalize
com.zaki.mytest.FinalizeTest@58ceff1
-------再次调用gc--------
null
总结:
当对象没被引用时,调用gc会自动调用finalize(),但只会调用一次。所以,如果覆盖finalize()方法,在调用时重新让该对象被引用,可以让该对象避免被回收,从而复活。
复活之后,如果再次将该对象的引用去掉,再次调用gc,则不会进入finalize()方法,所以无法再次复活。