Java有析构函数吗?我好像找不到任何关于这个的文件。如果没有,我怎样才能达到同样的效果?

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

作为一个通常的C/ c++程序员,我认为这是微不足道的实现。(因此我打算最后实现它。)我构造了我的程序,使所有“可重置”的对象都在同一个类中,这样当按下重置按钮时,我就可以销毁所有“活动”对象。

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


当前回答

Java没有任何析构函数。在Java中,它背后的主要原因是垃圾收集器总是被动地在后台工作,所有对象都在堆内存中创建,这是GC工作的地方。在c++中,我们必须显式调用delete函数,因为没有垃圾收集器之类的东西。

其他回答

我刚刚扫描的所有答案的缺失形式是终结器更安全的替代品。关于使用try-with-resources和避免终结器,所有其他答案都是正确的,因为它们不可靠,现在已弃用……

但是他们没有提到清洁工。Java 9中添加了清洁器,以一种比终结器更好的方式显式地处理清理工作。

https://docs.oracle.com/javase/9/docs/api/java/lang/ref/Cleaner.html

如果您正在编写Java Applet,则可以重写Applet的“destroy()”方法。它是……

*由浏览器或applet查看器调用来通知 *这个applet,它正在被回收,它应该销毁 *已分配的任何资源。stop()方法 *总是在destroy()之前被调用。

显然不是你想要的,但可能是别人在寻找的。

不,. lang。Object#finalize是最接近的。

但是,不保证何时(以及是否)调用它。 看到:java.lang.Runtime # runFinalizersOnExit(布尔)

我过去主要处理c++,这也是我寻找析构函数的原因。我现在经常使用JAVA。我所做的,可能对每个人来说都不是最好的,但我实现了我自己的析构函数通过将所有值重置为0或通过函数的默认值。

例子:

public myDestructor() {

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

}

理想情况下,这并不适用于所有情况,但在有全局变量的情况下,只要你没有大量的全局变量,它就可以工作。

我知道我不是最好的Java程序员,但它似乎对我有用。

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

Java does support finalizers, but they are meant to be used only as a safeguard for objects holding a handle to native resources like sockets, file handles, window handles, etc. When the garbage collector collects an object without a finalizer it simply marks the memory region as free and that's it. When the object has a finalizer, it's first copied into a temporary location (remember, we're garbage collecting here), then it's enqueued into a waiting-to-be-finalized queue and then a Finalizer thread polls the queue with very low priority and runs the finalizer.

当应用程序退出时,JVM停止而不等待挂起的对象完成,因此实际上不能保证终结器将运行。