finalize()方法的作用是什么?

  • Post category:Java

finalize() 方法是 Java 中的一个预定义方法,它是 Object 类中的 protected 方法,用于在垃圾收集器回收对象之前调用,以进行资源清理和其他清理操作。这个方法可以被子类覆盖,以实现对象销毁前的一些必要操作,如释放资源、关闭文件、断开网络链接等。

finalize() 方法的主要作用是在对象被销毁之前,进行一些必要的清理工作,通过继承 Object 类并重写该方法来实现。由于其执行时间是不确定的,因此它并不是解决资源清理问题的最佳方式。

以下是两个示例:

示例 1:

public class MyObject {
    private FileInputStream in = null;

    public MyObject(String fileName) throws FileNotFoundException {
        in = new FileInputStream(fileName);
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println("Closing file");
        in.close();
    }
}

上面的代码定义了一个 MyObject 类,其中包含了一个文件输入流对象 in,在对象销毁前需要关闭该文件输入流,防止资源泄漏。重写了 finalize() 方法,在对象被销毁时将文件输入流关闭。

示例 2:

public class Connection {
    private int id;
    private boolean connected;

    public Connection(int id) {
        this.id = id;
        connected = true;
    }

    public void disconnect() {
        connected = false;
        System.out.println("Connection " + id + " disconnected");
    }

    @Override
    protected void finalize() throws Throwable {
        if (connected) {
            disconnect();
        }
    }
}

上面的代码定义了一个 Connection 类,其包含一个 id 和一个 connected 属性,表示一个网络连接是否处于连接状态。该类还包含一个 disconnect() 方法用于断开网络连接,我们希望在该对象被销毁前调用 disconnect() 方法关闭网络连接。通过继承 Object 类并重写 finalize() 方法,在对象被销毁时判断网络连接状态,如果处于连接状态则调用 disconnect() 方法关闭网络连接。

需要注意的是,由于垃圾回收并不是实时的,所以 finalize() 方法也不是一定会被调用的,因此不能直接依赖于该方法进行重要的资源释放操作。推荐的做法是尽早释放资源,避免长时间占用系统资源,减轻系统的负担。