我讀(某處)finalize()
不保證當子類被垃圾收集時調用父類,這是否意味着大多數開發人員覆蓋子類中的finalize()
並調用super.finalize()
?你是否在子類中調用super.finalize()?
7
A
回答
13
Finalize不會自動調用超類。所以,如果你重寫敲定,以確保超類的正確方法得到清理將
protected void finalize() {
try {
// do subclass cleanup
}
finally {
super.finalize();
}
}
看到這個參考文章http://www.ibm.com/developerworks/java/library/j-jtp06294/index.html
應該值得注意的是,終結不是很容易預測而你不知道對他們是否運行有任何控制。在最終確定方法中不應該做任何關鍵的事情。一般來說,最好只是對班級進行明確的清理。
3
最好避免依靠finalize清理任何非Java資源(不保證完成調用)。如有可能,請嘗試使用資源(如果使用JDK7)或嘗試最終子句以儘可能地清理其他選項中的資源。如果您要使用finalize,您可以將super.finalize放入try finally塊中。不依靠敲定來清理資源是明智的。
// don't make it public!
protected void finalize() throws Throwable
{
try
{
// custom finalization here
}
finally
{
super.finalize();
}
}
如果這個想法是清理資源,這將是明智的,也許看看虛引用 - 對象是虛可如果它既不強/弱/軟可及,已經敲定&有在至少一個幻影參考(即對象已完成但尚未回收)。
相關問題
- 1. 是否dequeueReusableCellWithIdentifier:在我的UITableViewCell子類中調用初始化器?
- 2. 你可以調用AudioObjectSetPropertyData是否同步?
- 3. 你是否在電子郵件中使用換行符?
- 4. 是否有可能只在Perl中調用子程序調用?
- 5. 在子類中調用基類的模板函數是否合法?
- 6. 是否可以在超類實現中調用子類虛函數?
- 7. 在Python中調用函數時,你是否總是需要引用這個包?
- 8. 你的javadocs是否被編譯到你的類文件中?
- 9. 檢查調用對象是否是子類的實例
- 10. 在類或子類中調用發佈?
- 11. 如何在子類中調用父類?
- 12. 父類是否應引用子類?
- 13. 從Java子類中調用的方法不是在父類
- 14. 你是否需要在UIButton上調用removeTarget?
- 15. IBodyModelValidator你是否缺少類型映射?
- 16. 是否有可能從Java的超類中調用子類的實例變量?
- 17. 你是否將你的助手類存儲在單獨的程序集中?
- 18. 在自定義子類中調用超級tableView:didSelectRowAtIndexPath:是否可以接受?
- 19. 你是否必須在UIView上調用setFrame之後顯式調用setNeedsDisplay?
- 20. 你是否曾經在API中爲布爾類型返回null?
- 21. 子類是否也可以是超類?
- 22. 當子類化threading.Thread時,是否必須調用super.join()?
- 23. 檢查函數是否在try子句中調用
- 24. 你如何調用在你的java類中的UI中輸入的值?
- 25. 調用子類中「super.loadUrl」
- 26. 調用子類從Java中
- 27. GameObject.GetComponent()是否查找子類?
- 28. 你是否總是在Hibernate中使用二級緩存?
- 29. 你通常在你的Git pre-commit鉤子中包含哪些腳本/調用?
- 30. cancelOperation在NSView子類中不調用
有效的Java - 項目7:避免終結器。如果你確實使用了終結器,你應該調用super.finalize()。 – assylias 2012-07-07 22:26:46
那麼當子類被垃圾收集時,finalize()會被調用超類嗎? – user997112 2012-07-07 22:29:50
偉大的文章,我認爲有相關性:[爲什麼Finalize保護](http://www.0xcafefeed.com/2005/09/why-is-finalize-method-protected/)。 – 2012-07-07 22:30:43