在关闭对象上调用析构函数

时间:2013-09-30 09:47:34

标签: java

我想调用析构函数,当我关闭对象时,但我不知道如何或何时,...我尝试完成最终确定,但它没有调用。我不知道为什么

有示例代码,我尝试使用调试器,但它帮助我..

class tralala(){ 

    int i=0;

    tralala(){
    i=i+1;}
    protected void finalize( ){
      i=i-1;
    }}

但它不是叫我不知道为什么。如果有人有建议,请帮助我。我现在处于卡住状态,但如果java有析构函数,我并不感到害羞。

5 个答案:

答案 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时调用它。