我遇到了这个问题并且正在寻找一些想法?
答案 0 :(得分:15)
你不需要(也不应该尝试使用)析构函数 - 或者在Java中调用它们:“终结器”。
VM规范允许VM实现永远不会调用它们。因此,它们对资源发布等不可靠。一般来说,在对象被垃圾收集之前,VM可以调用任何对象的finalize()
方法中的代码,但由于这不是强制性的,因此应该避免使用它。
答案 1 :(得分:4)
Java是垃圾收集的,因此无法确定何时调用析构函数(当您的对象被垃圾收集时)。
有一个finalize
(继承)方法,但由于上面的确切原因你不能依赖它(你无法预测何时 - 以及它是否会被调用)。
答案 2 :(得分:2)
如果您只需要清理一些资源,可以拨打Runtime.getRuntime().addShutdownHook
答案 3 :(得分:2)
Java中的自动对象“破坏”永远不会在保证的时间发生。垃圾收集的唯一受助者是在收集对象之前将调用终结器方法。当然垃圾收集器永远不能保证运行,或者在运行时做任何事情。因此无法保证将调用finalize方法。
如果你想在Java中模拟C ++析构函数,最好的方法是使用下面的习惯用法(当出现异常处理时会有变化 - 我只会在这里展示最简单的情况):
final Resource r;
r = new Resource();
try
{
r.use();
}
finally
{
r.cleanup();
}
其中“cleanup”方法是“析构函数”。
这更像是基于堆栈的对象的C++ Resource Acquisition Is Initialization idiom,但不是很好。
答案 4 :(得分:1)
您可以查看此内容以获取有关最终确定的更多信息 - finalize() method
答案 5 :(得分:0)
由于其他人正在讨论正常情况。在特殊情况下,您要创建destroy()
,destruct()
,releaseExternalResources()
,shutdown()
等方法由控制该实例生命周期的实体主动调用。
例如,对象可以是ActiveObject,其中包含活动线程。在这种情况下,您要关闭它们,否则您将有内存泄漏。
虽然有人可能不会称之为析构函数......
在旁注中,我猜这个面试问题是一个技巧问题!
答案 6 :(得分:0)
从Java 1.7开始,可以使用Try-with-resources
任何继承自Closeable
或Autocloseable
的内容都可以使用它。
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
try (FileReader br = new FileReader(path)) {
return br.readLine();
}
这将自动调用close
函数,该函数保证在块结束时被调用。