Java 中的析构函数

Hiten Kanwar 2021年10月2日
Java 中的析构函数

析构函数与构造函数相反。一方面,构造函数用于初始化对象,析构函数用于销毁(删除)对象,从而释放对象占用的资源。

本教程将讨论 Java 中的析构函数、它们的工作方式和方法。

Java 没有析构函数,也没有直接的等价物。然而,它是一种强大的语言,其中一个原因是垃圾收集器。Java 为我们提供了一个垃圾收集器,其工作方式类似于析构函数。垃圾收集器,一个运行在 Java 虚拟机(JVM)上的程序(线程),通过删除未使用的对象来自动释放内存。

在 Java 中,内存的分配和释放由这个垃圾收集器有效地处理。当一个对象的生命周期完成时,垃圾收集器出现,删除该对象,并释放或释放该对象占用的内存。这种方法也称为非确定性的终结器。但问题是此方法(终结器)的调用无法保证,因为它是隐式调用的。

Java 中析构函数和 Finalize() 方法的工作

在 Java 中创建对象时,它会占用堆中的内存。线程进一步使用这些对象,如果一个线程不使用该对象,它们将有资格被垃圾收集器进行垃圾收集。因此,这些对象占用的内存现在变为空置,可以被任何新实体进一步利用。当垃圾收集器销毁任何对象时,Java 运行时环境 (JRE) 会调用 finalize() 方法来关闭连接,例如网络和数据库连接。

我们不能强制垃圾收集器执行和销毁对象。但是 Java 在这里提供了另一种方法。java 对象为我们提供了 finalize() 方法,其工作方式类似于析构函数。但是,它只能调用一次。

需要理解的一点是 finalize() 方法不是析构函数,而是提供额外的安全性并进一步确保外部资源,例如在关闭操作(程序)之前关闭文件,并且与析构函数的工作方式非常相似。

请参考下面的代码。

public class Dest_java {
    public static void main(String[] args) {
        Dest_java des = new Dest_java();  
        des.finalize();  
        des = null;  
        System.gc();  
        System.out.print("main() method ");  
    }  
    protected void finalize() {
        System.out.print("Destroyed ");  
    }  
}  

输出:

Destroyed main() method Destroyed