首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 繼承與 finalize():正確的清理鏈調用順序

     編輯:Java 相關知識

組合 vs 繼承的清理差異

  • 組合:成員對象獨立,GC 自動調用各自 finalize(),無需手動干預。
  • 繼承:衍生類 finalize() 必須顯式調用 super.finalize(),否則基類清理邏輯缺失。

正確模式:try-finally 保證鏈式調用

protected void finalize() {
    println("衍生類清理");
    try {
        super.finalize(); // 必須最後調用
    } catch (Throwable t) {}
}

關鍵點:

  1. super.finalize() 放在 最後,保證基類組件在衍生類清理完成後再銷毀(衍生類清理可能依賴基類方法)。
  2. 捕獲 Throwable 防止異常中斷鏈式調用。
  3. 用標誌位控制是否調用基類清理(示例中用命令行參數)。

運行演示

類層次:Frog → Amphibian → Animal → LivingCreature,每層含 Characteristic 成員。

  • 無基類清理:僅調用 Frog.finalize(),成員對象自動清理,基類 finalize() 全被跳過。
  • 啟用基類清理:按 Frog → Amphibian → Animal → LivingCreature 順序調用,再清理成員。順序與構造完全相反,符合 C++ 解構器語義。

成員對象清理順序

成員對象按創建順序清理(與構造順序同),但規格未保證順序,不應依賴。基類清理順序則由程序員通過 super.finalize() 位置精確控制。

注意:finalize() 不可靠

GC 不保證何時運行,甚至可能不運行。System.runFinalizersOnExit(true) 強制退出時調用,但已過時。現代 Java 推薦 try-with-resources / AutoCloseable 顯式管理資源。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved