
Java 教程
- Java - 首頁
- Java - 概述
- Java - 歷史
- Java - 特性
- Java vs. C++
- JVM - Java虛擬機器
- Java - JDK vs JRE vs JVM
- Java - Hello World 程式
- Java - 環境搭建
- Java - 基本語法
- Java - 變數型別
- Java - 資料型別
- Java - 型別轉換
- Java - Unicode 系統
- Java - 基本運算子
- Java - 註釋
- Java - 使用者輸入
- Java - 日期和時間
Java 控制語句
- Java - 迴圈控制
- Java - 決策機制
- Java - if-else
- Java - switch
- Java - for 迴圈
- Java - for-each 迴圈
- Java - while 迴圈
- Java - do-while 迴圈
- Java - break
- Java - continue
面向物件程式設計
- Java - 面向物件概念
- Java - 物件和類
- Java - 類屬性
- Java - 類方法
- Java - 方法
- Java - 變數作用域
- Java - 建構函式
- Java - 訪問修飾符
- Java - 繼承
- Java - 聚合
- Java - 多型
- Java - 方法重寫
- Java - 方法過載
- Java - 動態繫結
- Java - 靜態繫結
- Java - 例項初始化塊
- Java - 抽象
- Java - 封裝
- Java - 介面
- Java - 包
- Java - 內部類
- Java - 靜態類
- Java - 匿名類
- Java - 單例類
- Java - 包裝類
- Java - 列舉
- Java - 列舉建構函式
- Java - 列舉字串
Java 內建類
Java 檔案處理
Java 錯誤和異常
- Java - 異常
- Java - try-catch 塊
- Java - try-with-resources
- Java - 多重catch塊
- Java - 巢狀 try 塊
- Java - finally 塊
- Java - throw 異常
- Java - 異常傳播
- Java - 內建異常
- Java - 自定義異常
Java 多執行緒
- Java - 多執行緒
- Java - 執行緒生命週期
- Java - 建立執行緒
- Java - 啟動執行緒
- Java - 執行緒連線
- Java - 執行緒命名
- Java - 執行緒排程器
- Java - 執行緒池
- Java - 主執行緒
- Java - 執行緒優先順序
- Java - 守護執行緒
- Java - 執行緒組
- Java - 關閉鉤子
Java 同步
Java 網路程式設計
- Java - 網路程式設計
- Java - 套接字程式設計
- Java - URL 處理
- Java - URL 類
- Java - URLConnection 類
- Java - HttpURLConnection 類
- Java - Socket 類
- Java - 泛型
Java 集合
Java 介面
Java 資料結構
Java 集合演算法
高階 Java
- Java - 命令列引數
- Java - Lambda 表示式
- Java - 傳送郵件
- Java - Applet 基礎
- Java - Javadoc 註釋
- Java - 自動裝箱和拆箱
- Java - 檔案不匹配方法
- Java - REPL (JShell)
- Java - 多版本 Jar 檔案
- Java - 私有介面方法
- Java - 內部類菱形運算子
- Java - 多解析度影像 API
- Java - 集合工廠方法
- Java - 模組系統
- Java - Nashorn JavaScript
- Java - Optional 類
- Java - 方法引用
- Java - 函式式介面
- Java - 預設方法
- Java - Base64 編碼解碼
- Java - switch 表示式
- Java - Teeing 收集器
- Java - 微基準測試
- Java - 文字塊
- Java - 動態 CDS 歸檔
- Java - Z 垃圾收集器 (ZGC)
- Java - 空指標異常
- Java - 打包工具
- Java - 密封類
- Java - 記錄類
- Java - 隱藏類
- Java - 模式匹配
- Java - 簡潔數字格式化
- Java - 垃圾回收
- Java - JIT 編譯器
Java 雜項
- Java - 遞迴
- Java - 正則表示式
- Java - 序列化
- Java - 字串
- Java - Process API 改進
- Java - Stream API 改進
- Java - 增強的 @Deprecated 註解
- Java - CompletableFuture API 改進
- Java - 流
- Java - 日期時間 API
- Java 8 - 新特性
- Java 9 - 新特性
- Java 10 - 新特性
- Java 11 - 新特性
- Java 12 - 新特性
- Java 13 - 新特性
- Java 14 - 新特性
- Java 15 - 新特性
- Java 16 - 新特性
Java API 和框架
Java 類引用
- Java - Scanner
- Java - 陣列
- Java - 字串
- Java - Date
- Java - ArrayList
- Java - Vector
- Java - Stack
- Java - PriorityQueue
- Java - LinkedList
- Java - ArrayDeque
- Java - HashMap
- Java - LinkedHashMap
- Java - WeakHashMap
- Java - EnumMap
- Java - TreeMap
- Java - IdentityHashMap
- Java - HashSet
- Java - EnumSet
- Java - LinkedHashSet
- Java - TreeSet
- Java - BitSet
- Java - Dictionary
- Java - Hashtable
- Java - Properties
- Java - Collection
- Java - Array
Java 有用資源
Java - 訪問修飾符
Java **訪問修飾符** 用於指定變數的作用域、資料成員、方法、類或建構函式。這些有助於限制和保護資料的訪問(或訪問級別)。
Java中有四種不同的訪問修飾符,我們列舉如下:
- 預設(不需要關鍵字)
- 私有 (private)
- 受保護 (protected)
- 公有 (public)

預設訪問修飾符
預設訪問修飾符意味著我們沒有顯式宣告類、欄位、方法等的訪問修飾符。
未宣告任何訪問控制修飾符的變數或方法可用於同一包中的任何其他類。介面中的欄位隱式為 public static final,介面中的方法預設為 public。
預設訪問修飾符示例
變數和方法可以宣告為沒有任何修飾符,如下例所示:
String version = "1.5.1"; boolean processOrder() { return true; }
私有訪問修飾符
宣告為私有的方法、變數和建構函式只能在其宣告的類中訪問。
私有訪問修飾符是最嚴格的訪問級別。類和介面不能是私有的。
如果類中存在公共 getter 方法,則可以訪問宣告為私有的變數。
使用 private 修飾符是物件封裝自身並隱藏外部世界資料的主要方式。
私有訪問修飾符示例
示例 1
以下類使用私有訪問控制:
public class Logger { private String format; public String getFormat() { return this.format; } public void setFormat(String format) { this.format = format; } }
這裡,Logger 類的 *format* 變數是私有的,因此其他類無法直接檢索或設定其值。
因此,為了使此變數可用於外部世界,我們定義了兩個公共方法:*getFormat()*,它返回 format 的值,以及 *setFormat(String)*,它設定其值。
示例 2
在此示例中,Logger 類的類資料成員和方法是私有的。我們嘗試在另一個類 Main 中訪問這些類方法。
class Logger { private String format; private String getFormat() { return this.format; } private void setFormat(String format) { this.format = format; } } public class Main { public static void main(String[] args) { // Creating an object Logger log = new Logger(); // Setting the value log.setFormat("Text"); // Getting the value System.out.println(log.getFormat()); } }
輸出
Main.java:18: error: setFormat(String) has private access in Logger log.setFormat("Text"); ^ Main.java:20: error: getFormat() has private access in Logger System.out.println(log.getFormat()); ^ 2 errors
受保護訪問修飾符
在超類中宣告為受保護的變數、方法和建構函式只能被其他包中的子類或受保護成員類的包中的任何類訪問。
受保護訪問修飾符不能應用於類和介面。方法、欄位可以宣告為受保護的,但是介面中的方法和欄位不能宣告為受保護的。
受保護訪問使子類有機會使用幫助程式方法或變數,同時阻止不相關的類嘗試使用它。
受保護訪問修飾符示例
示例 1
以下父類使用受保護的訪問控制,以允許其子類重寫 *openSpeaker()* 方法:
class AudioPlayer { protected boolean openSpeaker(Speaker sp) { // implementation details } } class StreamingAudioPlayer extends AudioPlayer { boolean openSpeaker(Speaker sp) { // implementation details } }
這裡,如果我們將 `openSpeaker()` 方法定義為私有(private),那麼除了 `AudioPlayer` 類之外,任何其他類都無法訪問它。如果將其定義為公共(public),那麼外部世界的所有類都可以訪問它。但我們的意圖是僅將其暴露給它的子類,這就是我們使用受保護(protected)修飾符的原因。
示例 1
此示例演示了受保護訪問修飾符的使用。
// Class One class One { protected void printOne() { System.out.println("printOne method of One class."); } } // Inheriting class One on Main public class Main extends One { public static void main(String[] args) { // Creating an object of Main class Main obj = new Main(); // Calling printOne() method of class One // through the object of Main class obj.printOne(); } }
輸出
printOne method of One class.
公共訪問修飾符
宣告為公共(public)的類、方法、建構函式、介面等可以從任何其他類訪問。因此,在公共類內宣告的欄位、方法、程式碼塊可以從屬於 Java 宇宙的任何類訪問。
但是,如果我們嘗試訪問的公共類位於不同的包中,那麼仍然需要匯入該公共類。由於類的繼承性,類的所有公共方法和變數都將被其子類繼承。
語法
以下函式使用公共訪問控制:
public static void main(String[] arguments) { // ... }
應用程式的 `main()` 方法必須是公共的。否則,Java 直譯器(例如 java)將無法呼叫它來執行該類。
公共訪問修飾符示例
此示例演示了公共訪問修飾符的使用。
// Class One class One { public void printOne() { System.out.println("printOne method of One class."); } } public class Main { public static void main(String[] args) { // Creating an object of class One One obj = new One(); // Calling printOne() method of class One obj.printOne(); } }
輸出
This example demonstrates the use of public access modifier.
訪問修飾符和繼承
繼承方法將強制執行以下規則:
在超類中宣告為公共的方法在所有子類中也必須是公共的。
在超類中宣告為受保護的方法在子類中必須是受保護的或公共的;它們不能是私有的。
私有方法根本不會被繼承,因此沒有關於它們的規則。
下表根據訪問修飾符總結了在相同/不同類(或包)中的可訪問性。

帶有繼承的訪問修飾符示例
在這個示例中,我們建立了一個類,其中包含一個私有變數 `age` 和一個具有預設作用域的變數 `name`。使用 setter/getter 方法,我們更新 `age` 並獲取其值,而 `name` 是直接更新的。
public class Puppy { private int age; String name; public Puppy() { } public void setAge( int age ) { this.age = age; } public int getAge( ) { return age; } public static void main(String []args) { Puppy myPuppy = new Puppy(); // update age variable using method call myPuppy.setAge( 2 ); // update name directly myPuppy.name = "Tommy"; System.out.println("Age: " + myPuppy.getAge() +", name: " + myPuppy.name ); } }
輸出
Age: 2, name: Tommy