2011-05-30 50 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方法不執行特殊操作;它通常只是返回