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

Java 修飾符完整總覽:11 種修飾符語義、適用對象與實務用法

     編輯:Java 程式設計入門

修飾符分類

類別修飾符適用對象核心語義
存取控制public類、介面、成員全域可見,無封裝限制
protected成員同套件 + 子類 (跨套件) 可見
private成員僅宣告類內部可見
(package-private)類、介面、成員無修飾符 = 同套件可見
非存取static巢狀類、方法、欄位、初始化區塊屬於類而非實例;共享單一副本
final類、方法、欄位、區域變數類不可繼承、方法不可覆寫、欄位/變數不可變
行為語義abstract類、介面、方法類不可實例化、方法無實作 (交由子類)
synchronized方法隱式鎖定:靜態鎖 Class、非靜態鎖 this
native方法實作由 JNI 原生碼 (C/C++) 提供
strictfp類、方法強制浮點運算遵循 IEEE 754 (跨平台一致性)
volatile欄位主記憶體可見性、禁止指令重排、不保證原子性
transient欄位序列化時跳過此欄位

深度解析:易混淆重點

1. protected vs package-private


// package A
public class Parent {
    protected int prot = 1;
    int pkg = 2; // package-private
}

// package B
public class Child extends Parent {
    void test() {
        System.out.println(prot); // OK: 子類可見
        // System.out.println(pkg); // 編譯錯誤:跨套件不可見
    }
}

2. static 完整語義

  • 靜態欄位:類層級共享,ClassName.field 存取
  • 靜態方法:無 this,不可呼叫非靜態成員,可被繼承但不可覆寫 (隱藏)
  • 靜態初始化區塊:static { ... },類載入時執行一次
  • 靜態內部類:不持有外部類引用,獨立載入

3. final 三重語境

4. abstract 規則

  • 含 abstract 方法的類必須宣告為 abstract
  • abstract 類可無抽象方法 (純粹防止實例化)
  • 介面隱式 abstract (JDK 8 前方法預設為 abstract)

5. synchronized 實戰


// 實例方法同步 = synchronized(this)
public synchronized void instanceMethod() { ... }

// 靜態方法同步 = synchronized(MyClass.class)
public static synchronized void staticMethod() { ... }

// 同步區塊 (精細鎖粒度)
public void method() {
    synchronized (lockObject) { ... }
}

6. volatile 記憶體可見性

class Flag {
    volatile boolean stop = false; // 保證寫入對其他執行緒立即可見
    void run() { while (!stop) { ... } }
    void stop() { stop = true; }
}

不保證:複合操作原子性 (volatile int i; i++; 非原子)。需配合 AtomicInteger 或 synchronized。

7. transient 序列化排除


class User implements Serializable {
    String username;
    transient String password; // 不序列化
    transient Logger logger;   // 非序列化資源
}

8. strictfp 浮點嚴格模式

預設 JVM 可使用 CPU 暫存器額外精度 (x86 80-bit),導致跨平台結果微異。strictfp 強制嚴格 IEEE 754 (32/64-bit)。


strictfp class StrictMath { // 類內所有方法自動 strictfp
    strictfp double calc() { return 0.1 + 0.2; } // 保證跨平台一致
}

9. native JNI 橋接


// Java
public class NativeLib {
    static { System.loadLibrary("mylib"); }
    public native int add(int a, int b);
}

// C (JNI)
JNIEXPORT jint JNICALL Java_NativeLib_add(JNIEnv *env, jobject obj, jint a, jint b) {
    return a + b;
}

組合使用規則

  • abstract + final:互斥 (abstract 要求覆寫,final 禁止覆寫)
  • abstract + private:互斥 (private 不可被子類看見覆寫)
  • abstract + static:互斥 (static 無 this,無多型)
  • abstract + synchronized:互斥 (abstract 無方法體)
  • final + volatile:合法 (常數不可變,volatile 無意義但合法)
  • static + final:常數模式 static final int MAX = 100;

實務建議

  1. 預設 package-private,按需放寬 → 封裝性最佳
  2. 常數用 static final,命名全大寫底線分隔
  3. 共享可變狀態:volatile 簡單旗標 / Atomic* 計數器 / synchronized 複雜邏輯
  4. 序列化類:明確標記 transient (敏感資料、非序列化資源)
  5. 介面方法:JDK 8+ 可用 default/static/private,減少抽象類需求

總結

11 種修飾符構成 Java 封裝、並發、序列化、原生互操作、浮點精度的語言級控制面。精通其語義邊界與組合規則,是寫出健壯、可維護、高效能 Java 代碼的基礎功力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
對象效果範例
類不可被繼承final class String
方法不可被覆寫final void init()
欄位/變數賦值後不可變 (參考不變,物件內容仍可變)final List<String> list = new ArrayList<>();