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

Java final 關鍵字完全指南:編譯期常數、空白 final、final 參數、對象引用不可變性

     編輯:Java 相關知識

final 兩大核心場景

  1. 編譯期常數:基本類型、static final、編譯期可知值 → 編譯器內聯常數值。
  2. 運行期初始化不變值:final 字段在構造器/初始化塊賦值,之後不可改。

基本類型 vs 引用類型 final 差異

類型final 效果
基本類型值不可變(真常數)
引用類型引用不可變(指向固定對象),但對象內容可變

FinalData 完整示例

class Value { int i = 1; }
public class FinalData {
    final int i1 = 9;                 // 編譯期常數
    static final int I2 = 99;         // 編譯期常數
    public static final int I3 = 39;  // 標準常量定義
    final int i4 = (int)(Math.random()*20); // 運行期初始化
    static final int i5 = (int)(Math.random()*20); // 類加載時初始化一次
    Value v1 = new Value();
    final Value v2 = new Value();     // 引用不可變
    static final Value v3 = new Value();
    final int[] a = {1,2,3,4,5,6};    // 數組引用不可變,元素可改

    void print() { println("i4=" + i4 + ", i5=" + i5); }
}

運行驗證

fd1: i4 = 15, i5 = 9
Creating new FinalData
fd1: i4 = 15, i5 = 9  ← i4 不變(對象級),i5 不變(類級)
fd2: i4 = 10, i5 = 9  ← 新對象 i4 不同,i5 同

空白 final (Blank Final)

聲明 final 但不立即賦值,**必須在構造器中初始化**(每個構造器都要)。

class BlankFinal {
    final int i = 0;   // 顯式初始化
    final int j;       // 空白 final
    final Poppet p;    // 空白 final 引用
    BlankFinal() { j = 1; p = new Poppet(); }
    BlankFinal(int x) { j = x; p = new Poppet(); }
}

編譯器強制檢查所有構造路徑均初始化了空白 final。

final 參數

void with(final Gizmo g) { g.spin(); } // g 不可重新賦值
int g(final int i) { return i + 1; }   // 基本類型只讀
  • 引用參數 final:不可指向新對象,可調用方法修改對象內容。
  • 基本類型參數 final:不可修改值。
  • 匿名內部類捕獲外部變量需 final(Java 8+ 實際 final 即可)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved