一、介绍
当一个对象没有引用的时候,对象的垃圾回收器会调用finalize方法。
- 当对象被回收时,系统自动调用该对象的finalize方法,子类可以重写该方法,做一些释放资源的操作。
- 什么时候被回收:当某个对象没有任何引用时,jvm就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁对象前,会先调用finalize方法。
- 垃圾回收机制的调用,是由系统来决定(有自己的GC算法),也可以通过System.gc()主动触发垃圾回收机制。
Tip:并不是说有一个垃圾对象,垃圾回收器就马上回收,它有一套自己的算法(在jvm中会讲)。
我们在实际开发中,几乎不会使用finalize方法(但是面试可能会用)
二、finalize例子
package object;
//演示finalize的用法
public class Finalize {
public static void main(String[] args) {
Car bmw = new Car("宝马");
//这时bmw对象就是一个垃圾,垃圾回收器就会回收(销毁)对象(就是释放它的堆内存,可以腾出来给别的对象用),在销毁对象前,会调用该对象的finalize方法
//程序员可以在finalize方法中,写自己的业务逻辑代码(比如释放资源: 数据库连接,or打开的文件...)
//如果程序员不重写finalize方法,那么就会调用Object类的finalize方法,即默认处理(Object类的finalize方法是什么也不干的,即Object类只是提供了这样一个机制,但并没有做实事)
//如果程序员重写finalize方法,就可以实现自己的逻辑
bmw = null;
System.gc(); //主动调用垃圾回收器
System.out.println("程序退出了...");
}
}
class Car{
private String name;
public Car(String name) {
this.name = name;
}
//重写finalize方法
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("我们销毁汽车" + name);
System.out.println("释放了某些资源...");
}
}
输出结果如下:
程序退出了...
我们销毁汽车宝马
释放了某些资源...
在这里面,并不会出现System.gc();语句执行完之后,再向下执行的情况,而是会有一种多线程的情况,所以先输出了“程序退出了...”