我想调用析构函数,当我关闭对象时,但我不知道如何或何时,...我尝试完成最终确定,但它没有调用。我不知道为什么
有示例代码,我尝试使用调试器,但它帮助我..
class tralala(){
int i=0;
tralala(){
i=i+1;}
protected void finalize( ){
i=i-1;
}}
但它不是叫我不知道为什么。如果有人有建议,请帮助我。我现在处于卡住状态,但如果java有析构函数,我并不感到害羞。
答案 0 :(得分:2)
我认为您正在尝试实现类似析构函数的类似行为。由于析构函数不适用于Java,我认为您正在尝试使用finalize。
但是当一个对象即将收集垃圾时调用finalize方法。这可以在它有资格进行垃圾收集之后的任何时间。 请注意,对象永远不会被垃圾收集(因此永远不会调用finalize)。当对象永远不符合gc条件(因为它可以在JVM的整个生命周期内访问),或者在对象符合条件的时间和JVM停止运行的时间之间没有实际运行垃圾收集时,就会发生这种情况(这通常发生在你的程序)。
详细了解When is the finalize() method called in Java?和Why not to use finalize() method in java
并阅读How to implement object counter in Java SO QA以获取解决方案。这用于对象计数器。您可以使用相同的逻辑。
答案 1 :(得分:2)
方法finalize()“当垃圾收集确定没有对该对象的更多引用时,由对象上的垃圾收集器控制”。所以它会在垃圾收集器观察它被删除后被调用,但是当对象离开范围时不会立即调用。
我无法理解你所说的“近距离物体”是什么意思?你应该找到一些其他的架构解决方案来做你想做的事情:当对象离开范围(“关闭对象”)时,可能只是调用你的方法或用提供的处理程序引发一些自定义事件。
答案 2 :(得分:1)
java中没有析构函数
class Tralala(){
int i=0;
Tralala(){
i=i+1;}
protected void reset( ){
i=i-1;
}}
当你想破坏时调用reset
方法。
作为旁注:代码中有很多更正,例如命名约定,格式化以及提供修饰符。
而且我没有得到,在敲击完毕时,你的实例已经不复存在了。为什么你当时正在重置,因为在此之后没有更多的操作。
答案 3 :(得分:1)
JAVA没有析构函数。 JAVA有垃圾收集器。垃圾收集器作为线程运行,并自动销毁没有任何活动引用的实例。
答案 4 :(得分:1)
这取决于你关闭课程的定义。
您可以实现接口Closable,以便eclipse可以警告您在需要时不关闭实例。
它与finalize不同,因为你需要自己调用它。
你可以在finalize函数中调用close(),以确保在实例为GC时调用它。