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

Java final、finally、finalize 三者區別深度解析:修飾符、異常區塊、GC 方法

     編輯:Java 相關知識

快速對照表

關鍵字類型核心作用所屬層面
final修飾符不可變/不可繼承/不可覆寫語法/編譯期
finally程式碼區塊異常處理後必執行清理邏輯執行流程/運行期
finalize()Object 方法GC 回收前執行資源釋放記憶體管理/GC

一、final 修飾符完整指南

1. 修飾變數:常量

  • 基本型別:值不可變,必須在宣告或建構子初始化
  • 參考型別:引用不可變(指向同一物件),但物件內部狀態可修改
  • 編譯期常量折疊:final int A = 10; int b = A + 5; → 編譯期直接優化為 15

2. 修飾參數

public void method(final int param) {
    // param = 20; // 編譯錯誤
}
public void method(final List<String> list) {
    list.add("hello"); // ✅ 允許修改物件內容
    // list = new ArrayList<>(); // ❌ 禁止重新指派參考
}

用途:防止方法內部意外重新指派參考,文檔化意圖。

3. 修飾方法

  • 不可被子類別覆寫(private 方法隱性 final)
  • 編譯器可能內聯優化,提升效能(但過度使用導致程式碼膨脹反而降低效能)

4. 修飾類別

  • 不可被繼承(如 String、Integer、Math)
  • 所有方法隱性 final
  • 設計意圖:不可變類別、安全性、效能

二、finally 區塊:異常處理的保證

try {
    // 高風險操作
    FileInputStream fis = new FileInputStream("data.txt");
    // ...
} catch (FileNotFoundException e) {
    // 處理異常
} finally {
    // 無論 try 是否拋出異常、catch 是否處理、是否有 return,
    // finally 都會執行(除非 JVM 退出 System.exit())
    if (fis != null) fis.close(); // 資源清理
}

關鍵行為

  • try-catch-finally:catch 處理後執行 finally
  • try-finally(無 catch):異常拋給呼叫者,finally 先執行
  • return 在 try/catch 中 → finally 仍執行,且可能覆蓋返回值

三、finalize() 方法:已淘汰的 GC 鉤子

@Deprecated(since="9")
protected void finalize() throws Throwable {
    try {
        // 釋放原生資源:檔案控制代碼、Socket、JNI 記憶體等
    } finally {
        super.finalize();
    }
}

⚠️ 為何不建議使用

  1. 不可預測:GC 執行時間不確定,可能導致資源長時間不釋放
  2. 效能損耗:帶有 finalize 的物件需兩輪 GC 才能回收,增加 GC 壓力
  3. 無順序保證:多物件 finalize 執行順序不定
  4. Java 9 標記 @Deprecated,Java 18 移除

現代替代方案

  • try-with-resources (Java 7+):try (Resource r = ...) { } 自動調用 AutoCloseable.close()
  • Cleaner API (Java 9+):Cleaner.create().register(obj, cleaningAction) 替代 finalize
  • PhantomReference + ReferenceQueue:精確控制清理時機

綜合記憶口訣

final  —  定義「不變」:常數、封印類、禁覆寫
finally — 保證「必執行」:關流、釋鎖、善後
finalize — 過時「清理」:GC 前夕,慎用棄用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved