2013-09-30 129 views
-3

我想调用析构函数,当我关闭对象时,但我不知道如何或何时,..我尝试惠普finalize但它没有调用。我不知道为什么调用析构函数关闭对象

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

class tralala(){ 

    int i=0; 

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

但它不是叫我不知道为什么。如果有人有一个建议帮助我。我现在陷入困境,但是我不确定java是否有析构函数。

+3

请使用更好的代码格式。起初我认为这甚至不会编译。这是丑陋的,不可维护的。另外,请记住,根据Java的命名约定,您应该有以大写字母开头的类名称... – ppeterka

+0

Java中没有析构函数。因此你的问题一无所获。 – EJP

+0

可能重复的[有没有Java的析构?](http://stackoverflow.com/questions/171952/is-there-a-destructor-for-java) – Raedwald

回答

1

现在没有在java

class Tralala(){ 

    int i=0; 

    Tralala(){ 
    i=i+1;} 

    protected void reset(){ 
     i=i-1; 
    }} 

电话时永远要破坏reset方法没有析构函数。

附注:在代码中有很多更正,比如命名约定,格式和提供修饰符。

而我没有得到,当最终确定调用时,您的实例不再。为什么你在那个时候重置,因为在那之后没有更多的操作这个对象。

+0

我需要自动调用的方法吗? – Papi

+0

@Papi Nope.you无需重置,因为它自我过期的对象。 –

1

JAVA没有析构函数。 JAVA有垃圾收集器。垃圾收集器作为线程运行并自动销毁没有任何活动引用的实例。

1

它取决于您关闭类的定义。

您可以实现接口Closable,这样eclipse可以在需要时警告您不要关闭实例。

它不同于finalize,因为你需要自己调用它。

您可以在finalize函数中调用close()以确保在实例被GC调用时它会被调用。

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您的解决方案。这用于对象计数器。你可以使用相同的逻辑。

2

方法finalize()当垃圾回收确定没有更多的对象引用时,由对象上的垃圾回收器调用。所以它会在垃圾收集器观察它被删除后调用,但当对象离开作用域时不会立即被调用。

我真的不明白你的意思是什么“近距离物体”?你应该找到一些其他的架构解决方案来做你想做的事情:也许只是调用你的方法,或者当对象离开作用域(“close object”)时用提供的处理程序引发一些自定义事件。

相关问题