为了账号安全,请及时绑定邮箱和手机立即绑定

有用于Java的析构函数吗?

有用于Java的析构函数吗?

慕码人8056858 2019-07-10 10:01:50
有用于Java的析构函数吗?有用于Java的析构函数吗?我似乎找不到这方面的任何文件。如果没有,我怎样才能达到同样的效果?为了使我的问题更加具体,我正在编写一个处理数据的应用程序,规范中说应该有一个“重置”按钮,将应用程序恢复到它最初刚刚启动的状态。但是,除非应用程序关闭或按下重置按钮,否则所有数据都必须是“活动的”。作为一个C/C+程序员,我认为这是很容易实现的。(因此,我计划在最后实现它。)我构建了我的程序,使所有的“重置”对象都在同一个类中,这样当按下重置按钮时,我就可以销毁所有的“活动”对象。我在想,如果我所做的只是取消对数据的引用,等待垃圾收集器收集数据,那么如果我的用户重复输入数据并按下重置按钮,就不会有内存泄漏吗?我还在想,因为Java作为一种语言已经相当成熟,所以应该有一种方法来防止这种情况的发生或优雅地解决这个问题。
查看完整描述

3 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

看一下试着用资源声明。例如:

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

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

这句话比finalize在代码结构方面,但同时它使代码更易于理解和维护。而且,也不能保证finalize方法在应用程序的生存期内被调用。


查看完整回答
反对 回复 2019-07-10
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

不,这里没有破坏者。原因是所有Java对象都是堆分配和垃圾收集的。没有显式的去分配(即C+的删除操作符),就没有实现真正析构函数的合理方法。

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

当应用程序退出时,JVM停止,而不等待挂起的对象最后确定,因此实际上无法保证您的终结器将运行。


查看完整回答
反对 回复 2019-07-10
  • 3 回答
  • 0 关注
  • 838 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信