Java 中的析构函数
Hiten Kanwar
2021年10月2日
析构函数与构造函数相反。一方面,构造函数用于初始化对象,析构函数用于销毁(删除)对象,从而释放对象占用的资源。
本教程将讨论 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