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

Java final 關鍵字實戰教學:變量、方法、類與空白 final 完整示例

     編輯:Java 相關知識

通過代碼說話:final 四大用法實戰演示

1. final 變量:常量與引用固定

基本用法

class Test1 {
    final double PI = 3.14; // 聲明即初始化
    public Test1() { /* PI = 3.14; */ } // 若構造器再賦值會報錯
    void test() { System.out.println("PI is: " + PI); }
    public static void main(String[] args) { new Test1().test(); }
}

空白 final (Blank Final) - 必須在構造器初始化

class Test1 {
    final double PI; // 未初始化
    Test1() { PI = 3.14; } // 構造器賦值,否則編譯錯誤
    void test() { System.out.println("PI is: " + PI); }
}

靜態空白 final - 必須在靜態塊初始化

class Test1 {
    static final double PI;
    static { PI = 3.14; } // 靜態初始化塊
    void test() { System.out.println("PI is: " + PI); }
}

2. final 方法:禁止覆寫,保護核心邏輯

class Test {
    static final double PI = 3.14;
    final void test() { System.out.println("PI is: " + PI); }
}
class Test1 extends Test {
    public static void main(String[] args) { new Test1().test(); }
}
// 輸出: PI is: 3.14
// 子類不可覆寫 test(),嘗試會編譯失敗

3. final 類:封鎖繼承體系

final class Test1 {
    static final double PI = 3.14;
    final void test() { System.out.println("PI is: " + PI); }
    public static void main(String[] args) { new Test1().test(); }
}
// 任何類嘗試 extends Test1 都會編譯報錯

4. 深度思考:為什麼 String 設計為 final?

設計層面

  • 語義不可變:String 引用永遠指向 String 對象,防止子類破壞行為
  • 共享安全:字符串常量池複用依賴不可變性,避免副作用傳播

性能層面

  • 方法內聯:JIT 可直接解析 final 類方法,無需虛表查找
  • 逃逸分析與鎖消除:不可變對象無需同步,編譯器可激進優化

綜合案例:不可變類設計模板

public final class ImmutablePoint { // 1. 類 final
    private final int x, y;         // 2. 字段 final + private
    public ImmutablePoint(int x, int y) { this.x = x; this.y = y; }
    public int getX() { return x; }
    public int getY() { return y; }
    // 3. 無 setter,所有「修改」返回新實例
    public ImmutablePoint translate(int dx, int dy) {
        return new ImmutablePoint(x + dx, y + dy);
    }
    // 4. 防禦性拷貝(若持有可變對象)
    // private final List tags;
    // public ImmutablePoint(List tags) { this.tags = new ArrayList<>(tags); }
}

常見錯誤避坑指南

錯誤代碼問題修正
final List list = new ArrayList(); list = null;嘗試改變引用只修改內容:list.clear()
final int x; // 類字段無初始化空白 final 未在構造器賦值構造器中 this.x = 0;
static final int x; // 靜態字段無初始化靜態空白 final 未在靜態塊賦值靜態塊 static { x = 0; }
匿名內部類使用非 final 局部變量編譯錯誤加 final 或改為 effectively final

總結

final 是 Java 表達「不可變意圖」的核心工具。從基本類型常量到不可變類設計,掌握其初始化規則、引用語義與設計哲學,能寫出更安全、更清晰、更易優化的代碼。

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