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

Java 修飾符全解析:訪問控制、非訪問修飾符與組合規則速查表

     編輯:Java 綜合教學

Java 修飾符系統全景圖

Java 提供豐富的修飾符控制類、方法、變量的可見性、生命周期與行為。本文系統梳理 4 種訪問修飾符、6 種非訪問修飾符的語義、作用目標、組合規則與最佳實踐。

四大訪問修飾符:可見性矩陣

修飾符同類同包子類(異包)非子類(異包)
private✅❌❌❌
default (包私有)✅✅❌❌
protected✅✅✅❌
public✅✅✅✅

口訣:private < default < protected < public (可見性遞增)

類級別修飾符規則

修飾符頂層類內部類說明
public✅✅公共訪問
default✅✅包內訪問
abstract✅✅不可實例化,可含抽象方法
final✅✅不可被繼承
static❌✅僅修飾靜態內部類
protected/private❌✅僅修飾成員內部類

非訪問修飾符詳細解析

1. final:不可變契約

  • 類:不可繼承 (如 String, Integer)
  • 方法:不可重寫 (但可重載),編譯器可內聯優化
  • 變量:
    • 基本類型:值不可變 (編譯期常量折疊)
    • 引用類型:引用不可變,物件內容可變
    • 局部變量:僅能用 final,匿名內部類捕獲變量必須 final 或 effectively final
  • 接口默認常量:接口中字段隱式 public static final

2. static:類級別成員

  • 變量:類變量,全進程單份副本,ClassName.field 訪問
  • 方法:類方法,無 this,不可訪問實例成員,ClassName.method() 調用
  • 代碼塊:靜態初始化塊,類加載時執行一次,按聲明順序
  • 內部類:靜態內部類,無外部類引用,可獨立實例化

3. abstract:契約定義

  • 類:抽象類,不可實例化,可含抽象/具體方法,可含構造器
  • 方法:無方法體,子類必須實現 (除非子類也抽象)
  • 禁用組合:final、private、static、native、synchronized

4. synchronized:內置鎖

  • 方法:實例方法鎖 this,靜態方法鎖 Class 對象
  • 代碼塊:synchronized(obj) { } 精確控制鎖範圍
  • 不可用於:構造器、接口默認方法 (Java 8+ 除非显式)、變量

5. volatile:可見性保證

  • 禁止指令重排序 (內存屏障)
  • 保證讀寫直接作用於主內存,不保證原子性 (複合操作需鎖或 CAS)
  • 適用場景:狀態標志、雙重檢查鎖單例、獨立變量寫入

6. transient:序列化排除

  • 標記字段不參與默認 Java 序列化
  • 適用:敏感數據 (密碼)、衍生字段、非序列化物件引用、日志對象
  • 反序列化時該字段為默認值 (null/0/false)

7. native:本地方法

  • 聲明方法由 JNI 實現 (C/C++)
  • 無方法體,以分號結束
  • 常見:Object.hashCode(), System.arraycopy(), Thread.start()

修飾符組合規則速查

目標允許組合禁止組合
類public/abstract/final + defaultstatic/protected/private/synchronized/native/volatile/transient
方法訪問修飾符 + static/final/abstract/synchronized/nativeabstract+final, abstract+private, abstract+static, abstract+synchronized, abstract+native
字段訪問修飾符 + static/final/transient/volatilefinal+volatile (語義衝突), static+transient (無意義)
局部變量僅 final其餘所有
構造器訪問修飾符static/final/abstract/synchronized/native/volatile/transient

最佳實踐原則

  1. 最小可見性原則:默認 private,按需放寬
  2. 預設不可變:字段、參數、局部變量盡量 final
  3. 線程安全優先:共享可變狀態用 volatile + synchronized 或並發包
  4. 序列化謹慎:敏感/衍生字段加 transient,實現 serialVersionUID
  5. 文檔化意圖:關鍵修飾符添加註釋說明設計決策
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved