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

final、finally、finalize 三者區別詳解

     編輯:Java 程式設計入門

核心區別一覽

關鍵字類別作用對象核心含義
final修飾符類、方法、變量、參數不可變/不可繼承/不可覆寫
finally異常處理塊try-catch 結構無論是否拋出異常,代碼必定執行(除非 JVM 退出)
finalizeObject 方法對象實例GC 回收前調用,用於釋放非記憶體資源(不推薦,已棄用)

final 詳細規則

  • final 類:不可被繼承(如 String, Integer)。
  • final 方法:子類不可覆寫(可重載),鎖定實現邏輯,早期用於內聯優化。
  • final 變量:
    • 基本類型:值不可改(編譯期常量傳播)。
    • 引用類型:引用地址不可改,但對象內部狀態可變。
    • 實例變量:需在聲明時、構造器或實例初始化塊中賦值(確保構造完成前初始化)。
    • 靜態變量:聲明時或靜態初始化塊賦值。
  • final 參數:方法體內不可重新賦值,常用於匿名內部類/Lambda 捕獲局部變量(Java 8+ 實際上要求「實際最終」)。

finally 執行保證與陷阱

try {
    return 1; // 先計算返回值,暫存
} finally {
    System.out.println("清理資源"); // 必定執行
    // return 2; // 若這裡 return,會覆蓋外層返回值(惡習)
}

不執行 finally 的極端情況:System.exit(0)、JVM Crash、死循環導致線程無法到達、守護線程在非守護線程結束後被強制終止。

finalize() 為什麼不推薦使用?

  • 調用時機不確定:GC 觸發不可預測,可能長時間不回收,資源釋放延遲。
  • 性能開銷大:帶 finalize 的對象需進入 Finalizer 佇列,由專門線程處理,增加 GC 壓力。
  • 異常吞沒:finalize 拋出的異常會被忽略,導致對象處於破損狀態。
  • 已棄用 (Java 9):建議使用 Try-with-resources (AutoCloseable) 或 Cleaner/PhantomReference 管理非堆資源。
// 現代最佳實踐
try (FileInputStream fis = new FileInputStream("file.txt")) {
    // 使用資源
} // 自動調用 close(),即使拋出異常也保證執行
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved