finalize
finalize方法是Object类中的一个方法,当对象被回收时,系统会自动调用finalize方法。子类可以重写finalize方法做一些释放资源的操作
注意点:finalize方法并不是销毁对象的方法,只是在gc回收销毁前会调用一下 它,仅此而已。
对象什么时候会被回收
当某个对象没有任何引用时,则JVM就会认为该对象是一个垃圾对象,会使用垃圾回收机制销毁该对象,在销毁前,会先调用finalize方法
例如以下代码:
public class Finalize_ {
public static void main(String[] args) {
AoA a1 = new AoA();
BoB b1 = new BoB();
a1 = null;
b1 = null;
}
}
class AoA{}
class BoB{}
在上面的代码中,将分别指向两个对象的引用给滞空了。此时就没有任何引用指向这两个对象,这时这两个对象就是垃圾对象,会被GC回收机制给回收掉。在回收之前就会调用finlize方法,如果子类没有重写就会调用Object的finalize方法,子类重写了就调用子类自己的,一般都会加入释放资源等操作。
finalize使用案例
根据上面的代码,重写子类的finalize方法,添加释放资源字样示意。
由于GC不是实时回收的,而是根据回收的算法来回收的,所以需要借用System.gc()(主动发出申请调用垃圾回收器)。来帮助输出看效果
但要System.gc()注意并不是使用了100%会马上进行回收的,只是提高概率。(万一别人在忙就不来了)
public class Finalize_ {
public static void main(String[] args) {
AoA a1 = new AoA();
BoB b1 = new BoB();
a1 = null;
System.gc();
System.out.println("程序结束");
}
}
class AoA{
@Override
protected void finalize() throws Throwable {
System.out.println("等会回收,让我先释放资源····");
}
}
class BoB{}
输出结果
可以看到是先输出程序结束,再调用finalize方法,再进行回收。可以发现调用gc回收器并不会让程序堵塞,异步进行。
概括:当某个对象没有任何引用指向它,成为垃圾对象后,在GC回收它之前会调用它的finalize方法,子类没有就找父类运行