有没有Java的析构函数?

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

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

作为一名C / C ++程序员,我认为这将是微不足道的实施。 (因此我计划最后实现它。)我组织了我的程序,以便所有可重置对象都在同一个类中,以便在按下重置按钮时可以销毁所有“实时”对象。

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


由于Java是一种垃圾收集语言,因此无法预测何时(甚至是否)某个对象将被销毁。 因此没有直接相当于析构函数。

有一个名为finalize的继承方法,但这完全由垃圾收集器决定。 因此,对于需要明确整理的类,约定是定义一个关闭方法,并仅使用finalize来进行完整性检查(即,如果close没有被调用,现在就做并记录一个错误)。

有一个问题引发了最近定稿的深入讨论,所以如果需要,应该提供更多的深度...


没有,这里没有破坏者。 原因是所有的Java对象都是堆分配和垃圾收集。 没有明确的释放(即C ++的删除操作符),没有明智的方法来实现真正的析构函数。

Java确实支持终结器,但是它们只是用来保护处理本地资源(如套接字,文件句柄,窗口句柄等)的对象。当垃圾收集器收集没有终结器的对象时,它只会标记内存地区是免费的,就是这样。 当对象有一个终结器时,它首先被复制到一个临时位置(记住,我们在这里进行垃圾收集),然后将它排入等待定位队列,然后Finalizer线程以非常低的优先级轮询队列并运行终结器。

当应用程序退出时,JVM会停止而不等待挂起的对象完成,因此几乎不能保证您的终结器将永远运行。


如果您使用Java 7,请查看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方法。

链接地址: http://www.djcxy.com/p/3351.html

上一篇: Is there a destructor for Java?

下一篇: What are the roots?