Java有析构函数吗?

新手上路,请多包涵

Java有析构函数吗?我似乎无法找到任何关于此的文档。如果没有,我怎样才能达到同样的效果?

为了让我的问题更具体,我正在编写一个处理数据的应用程序,规范说应该有一个“重置”按钮,使应用程序恢复到其最初的刚启动状态。但是,除非关闭应用程序或按下重置按钮,否则所有数据都必须是“实时”的。

通常作为 C/C++ 程序员,我认为这实现起来很简单。 (因此我计划最后实现它。)我构建了我的程序,使所有“可重置”对象都在同一个类中,这样我就可以在按下重置按钮时销毁所有“活动”对象。

我在想如果我所做的只是取消引用数据并等待垃圾收集器收集它们,如果我的用户重复输入数据并按下重置按钮会不会出现内存泄漏?我也在想,既然 Java 作为一种语言已经相当成熟,应该有一种方法来防止这种情况发生或优雅地解决这种情况。

原文由 wai 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 709
2 个回答

因为 Java 是一种垃圾收集语言,您无法预测对象何时(甚至是否)会被销毁。因此,没有析构函数的直接等价物。

有一个名为 finalize 的继承方法,但这完全由垃圾收集器决定是否调用。因此,对于需要显式整理的类,惯例是定义一个 关闭 方法并仅使用 finalize 进行完整性检查(即,如果尚未调用 _关闭_,则立即调用并记录错误)。

最近有 一个问题引发了对 finalize 的深入讨论,因此如果需要,应该提供更深入的讨论……

原文由 Garth Gilmour 发布,翻译遵循 CC BY-SA 3.0 许可协议

查看 try-with-resources 语句。例如:

 try (BufferedReader br = new BufferedReader(new FileReader(path))) {
  System.out.println(br.readLine());
} catch (Exception e) {
  ...
} finally {
  ...
}

这里不再需要的资源在 BufferedReader.close() 方法中被释放。您可以创建自己的类来实现 AutoCloseable 并以类似的方式使用它。

该语句在代码结构方面比 finalize 更受限制,但同时它使代码更易于理解和维护。此外,不能保证 finalize 方法在应用程序的运行期间被调用。

原文由 Vitalii Fedorenko 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题