Java有析构函数吗?

664

Java有析构函数吗?我似乎找不到任何相关文档。如果没有,我该如何实现相同的效果?

为了让我的问题更具体,我正在编写一个处理数据的应用程序,并且规范要求有一个“重置”按钮,可以将应用程序恢复到刚启动时的状态。但是,所有数据都必须“实时”存在,除非应用程序关闭或按下重置按钮。

通常作为C/C++程序员,我认为这很容易实现。(因此我计划最后再实现它。)我将所有可“重置”的对象结构化到相同的类中,以便在按下重置按钮时可以销毁所有“实时”对象。

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


9
只有在保留了不需要的对象引用时才会出现内存泄漏,也就是说,你的程序存在缺陷。垃圾回收器将根据需要运行(有时更早)。 - Peter Lawrey
22
如果你正在通过对象快速处理数据,虚拟机可能不会及时运行垃圾回收。认为垃圾回收器总能跟上进度或做出正确决策是一种谬论。 - Kieveli
2
@Kieveli 在出现错误之前,JVM不会运行GC吗? - WVrock
4
如果Java有一个能够将其一次性销毁的析构函数,那就太好了。 - Tomáš Zato
@WVrock - 有趣的问题。答案是“不行”(至少对于某些类型的“通过对象快速处理数据”),但原因很微妙。实际上,当您在垃圾回收中花费大约97%的时间,并且只有3%的时间用于实际程序逻辑时,您会遇到实际错误,因为大多数引用仍然具有指向它们的指针。如果“快速处理”使用少量指针,则不会出现问题。 - sf_jeff
显示剩余2条评论
24个回答

0
尝试在Android编程中调用onDestroy()方法。这是在Activity/Service类被销毁之前执行的最后一个方法。

0

Java没有析构函数。这是因为在Java中,垃圾收集器始终在后台被动工作,并且所有对象都在堆内存中创建,而GC就是在堆内存中工作的。在C++中,我们必须显式调用delete函数,因为没有类似于垃圾收集器的东西。


0
在Java中,垃圾收集器会自动删除未使用的对象以释放内存。因此,Java没有可用的析构函数是合理的。

-3

我曾经主要处理C++,这也是我寻找析构函数的原因。现在我经常使用JAVA。我的做法可能不适用于所有人,但我通过一个函数将所有值重置为0或默认值来实现自己的析构函数。

例如:

public myDestructor() {

variableA = 0; //INT
variableB = 0.0; //DOUBLE & FLOAT
variableC = "NO NAME ENTERED"; //TEXT & STRING
variableD = false; //BOOL

}

理想情况下,这种方法并不适用于所有的情况,但如果有全局变量的话,只要你没有太多的全局变量,它就可以工作。
我知道我不是最好的Java程序员,但这种方法对我来说似乎是有效的。

尽量多使用不可变对象,在你理解之后,一切都会更加清晰 :) - R. van Twisk
5
这并不是错误,而是毫无意义——也就是没有任何效果。如果你的程序需要重置原始类型才能正常工作,那么你的类实例范围设置不正确,这意味着你可能会将现有对象的属性重新分配给一个新对象的属性,而没有创建一个新的Object()。 - simo.3792
1
除了有很多需要重置变量的情况外,我选择了“析构函数”这个名称,因为它符合我的操作。它确实实现了某些功能,只是你不理解而已。 - ChristianGLong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接