您的位置:

Java中的finalize方法

一、finalize方法概述

Java中的finalize()是Object中提供的一个方法,它属于Object的一个protected方法,所以在其他类中使用finalize()方法时,必须重写该方法并且使用public修饰,才能够使用。finalize()方法是Java中垃圾回收机制的一部分,垃圾回收机制会在可回收对象被销毁之前调用该方法回收对象的资源。该方法的返回值为void,没有参数,是一种“自动化”的垃圾收集器。

二、finalize方法的作用

对象无法直接判断是否可被销毁,只有在对象被标记“为可以回收”的时候,才进行垃圾回收,拥有finalize()方法的对象,在回收之前会首先调用该方法,来进行资源的回收和释放,该方法提供了给对象一个预自我销毁的方法。

三、使用finalize方法的注意事项

1、finalize()方法的执行时间是Java虚拟机不确定的,有可能对象被回收的同时,也有可能对象的finalize()方法被执行;

2、在JDK1.8及之前的版本中,finalize()方法只会被调用一次,表示在对象没有被回收之前,finalize方法会被一直调用以防止对象再次回收;

3、对象在进入finalize()方法之后,有可能被再次回收,如果对象被回收了,那么该方法会马上结束,不再执行下去;

4、在Java8以前的早期版本中,垃圾回收器会先调用finalize()方法,然后回收对象,但是在HotSpot JVM中,则是先回收对象,然后调用finalize()方法;

四、示例代码

下面是一个使用finalize()方法的示例程序:

public class FinalizeDemo {
    public static FinalizeDemo FD;

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("Finalize method called");
        FD = this;
    }

    public static void main(String[] args) {
        FinalizeDemo fd = new FinalizeDemo();
        System.out.println("fd:" + fd);
        fd = null;
        System.gc(); // 提示垃圾回收器运行
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("fd:" + FD);
    }
}

代码的输出结果为:

fd:FinalizeDemo@60e53b93
Finalize method called
fd:null

可以看到,在调用System.gc()提示垃圾回收器之后,finalize()方法被调用,FD指向了对象本身;在注释掉System.gc()之后,只在程序退出之前才会调用finalize()方法,FD值为null。