2011-05-30 31 views
0

我想知道它为什么需要写这个语句super.finalize()在下面的代码中的finalize()方法

代码。

protected void finalize() throws Throwable { 

    try { 

     close(); 

    } catch(Exception e) { 

    } 

    finally { 

     super.finalize(); 


    } 
} 

回答

1

你覆盖finalize方法,并因为你这样做,你需要调用家长finalize方法为好。否则,它可能没有相应地关闭流或其他资源。

您不必非常确定地调用该对象的finalize()方法,但是,例如,您可能会产生非常糟糕的错误。将代码复制/粘贴到另一个类或更改继承的父代。

它封装在finally块中以确保始终调用它,而不管发生了什么(例如close()方法中的异常)。

你也应该看看的Javadoc:http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#finalize

+0

可能没必要:类Object的finalize方法不执行特殊操作;它只是正常返回。 Object的子类可能会覆盖此定义.' – erickzetta 2011-05-30 11:54:15

+0

谢谢simon .... – yagnya 2011-05-30 11:54:27

+2

*否则可能不会在任何时候垃圾回收对象。*这完全不是真的,finalize用于管理资源不是JVM本身。对象**将是GC **'d,但任何托管资源可能都不是。 – bestsss 2011-05-30 11:59:56

1

如果close()抛出一个异常,那么超类的终结绝不会没有finally条款被调用。虽然,如果超类仅仅是一个Object那么它真的没有关系:根据文档,类Object的finalize方法不执行特殊操作;它通常只是返回