# Java 中的訪問修飾符
> 原文: [https://javabeginnerstutorial.com/core-java-tutorial/access-modifier-in-java/](https://javabeginnerstutorial.com/core-java-tutorial/access-modifier-in-java/)
Java 中的訪問修飾符可幫助您設置所需的類,變量和方法的訪問級別。
有三個訪問修飾符。 不包括默認訪問修飾符。 默認值為訪問控制,當未指定任何訪問修飾符時將設置訪問控制。
## 訪問控制
* `public`
* `private`
* `protected`
* 默認
訪問修飾符(*某些或全部*)可以應用于*類,變量,方法*。
## 類的訪問修飾符
Java 中的類只能使用`public`和默認訪問修飾符。
### `public`
設置為`public`時,java 世界中所有可用的類都可以訪問給定的類。
### 默認
當設置為默認值時,給定的類將可供同一包中定義的類訪問。
## Java 類的訪問修飾符表
| **可見性** | **公開訪問修飾符** | **默認訪問修飾符** |
| --- | --- | --- |
| **位于同一包中** | Yes | Yes |
| **來自同一個包** | Yes | NO |
## 實例和靜態變量的訪問修飾符
變量適用于所有下面提到的修飾符。
* `public`
* `private`
* `protected`
* 默認
> 在檢查在該類內部定義的變量的可見性之前,應檢查該類的可見性。
>
> 如果該類是可見的,則在該類內部定義的變量將是可見的。
>
> 如果看不到類,則即使將其設置為`public`,也將無法訪問任何變量。
### 默認
如果將變量設置為默認值,則同一包中定義的類將可以訪問該變量。 在同一包中的類中定義的任何方法都可以訪問變量或**繼承**或**直接訪問**。
### `public`
如果將變量設置為公開變量,則可以從 Java 世界中可用的任何類中進行訪問。 任何類中的任何方法都可以訪問給定變量或**繼承**或**直接訪問**。
### `protected`
如果將變量在類內設置為**受保護的**,則只能通過**繼承**從相同或不同包中定義的子類中對其進行訪問。
> 保護和默認之間的唯一區別是受保護的訪問修飾符遵守**類-子類關系**,而默認則不。
### `private`
只能從定義變量的類內部訪問定義的變量`private`。 此類變量不能從已定義的類外部訪問,甚至不能在其子類中訪問。
## Java 變量的訪問修飾符表
| **可見性** | **公共訪問修飾符** | **私有訪問修飾符** | **受保護的訪問修飾符** | **默認訪問修飾符** |
| --- | --- | --- | --- | --- |
| **在同一個類中** | Yes | Yes | Yes | Yes |
| **來自同一包裝中的任何類** | Yes | No | Yes | Yes |
| **來自同一包中的任何子類** | Yes | No | Yes | Yes |
| **來自不同包的任何子類** | Yes | No | Yes(**僅通過繼承**) | No |
| **來自不同包裝中的任何非子類** | Yes | No | No | No |
## 方法的訪問修飾符
方法適用于以下所有修飾符。
### 默認
當“方法”設置為默認值時,同一包中定義的類將可以訪問該方法。 在同一包中定義的任何類中的任何方法都可以訪問給定的方法或**繼承**或**直接訪問**。
### `public`
將方法設置為`public`時,可以從 Java 世界中可用的任何類中訪問它。 任何類中的任何方法都可以訪問或**繼承**或**直接訪問**的給定方法,具體取決于類級別的訪問。
`protected`
如果將方法設置為在類內部進行保護,則可以從在相同或不同包中定義的子類訪問該方法。
> 受保護的訪問權限和默認訪問權限之間的唯一區別是受保護的訪問修飾符遵守**的類-子類關系**,而默認的則不這樣做。
`private`
只能從定義其的類內部訪問定義為私有的方法。 此類方法無法從已定義的類外部訪問,甚至不能從其子類訪問。
## Java 方法的訪問修飾符表
| **可見性** | **公共訪問修飾符** | **私有訪問修飾符** | **受保護訪問修飾符** | **默認訪問修飾符** |
| --- | --- | --- | --- | --- |
| **相同類中** | Yes | Yes | Yes | Yes |
| **來自同一包中的任何類** | Yes | No | Yes | Yes |
| **來自同一包中的任何子類** | Yes | No | Yes | Yes |
| **來自不同包的任何子類** | Yes | No | Yes(**僅通過繼承**) | No |
| **來自不同包裝中的任何非子類** | Yes | No | No | No |
## 局部變量的訪問修飾符
*無法將*訪問修飾符應用于局部變量。 只能將`final`應用于局部變量,該局部變量是[非訪問修飾符](https://javabeginnerstutorial.com/core-java-tutorial/non-access-modifiers-in-java/ "Non Access Modifiers in Java")。
## 繼承或直接訪問之間的區別
下面說明了繼承和直接訪問之間的區別。
超類
```java
package com.jbt;
public class FirstClass {
public int i;
protected int j;
private int k;
int l;
}
```
同一包中的子類
```java
package com.jbt;
class SecondClass extends FirstClass {
void method() {
System.out.println(i);
System.out.println(j); // Respect the parent child relationship irrespective of package
System.out.println(k); // Compilation Error
System.out.println(l); // Accessible as it is in same package
FirstClass cls = new FirstClass();
System.out.println(cls.i);
System.out.println(cls.j);
System.out.println(cls.l);
// Private variable will not be accessible here also.
System.out.println(cls.k); // Compilation error
}
}
```
不同包中的子類
```java
package com.jbt.newpackage;
import com.jbt.FirstClass;
class SecondClass extends FirstClass {
void method() {
// Access through inheritance
System.out.println(i);
System.out.println(j); // Respect the parent child relationship irrespective of package
System.out.println(k); // Compilation error - private variable
System.out.println(l); // Compilation Error - not accessible as it is in diff package
FirstClass cls = new FirstClass();
System.out.println(cls.i); // Accessible because it is public
System.out.println(cls.j); // Compilation error
// Private variable will not be accessible here also.
System.out.println(cls.k); // Compilation error
System.out.println(cls.l); // Compilation error
}
}
```
### 備忘單
* `public`,`private`,`protected`是 3 種訪問修飾符
* Java 有 4 個訪問級別。 **公開,私有,受保護 & 默認**。
* 一個類只能具有公開和默認訪問級別。
* 方法和實例變量(**非本地**)可以使用所有 4 個訪問級別。
* 如果某個類對其他類不可見,則即使該成員的訪問級別是公開的,也沒有訪問該類成員的問題(**重要**)。
* 在成員可見之前,應檢查類可見性。
* 如果超類具有公開成員,則子類將繼承它,即使它在其他包中也是如此。
* `this`始終引用當前正在執行的對象。
* 其他成員甚至可以從其他包中訪問公開成員。
* 只能通過同一類中的代碼訪問私有成員。
* 默認成員對包外部的子類不可見。
* 即使在不同的包中,受保護的成員也可以被子類看到。
* *受保護*與*默認*之間的不同之處在于,默認僅在包之外的子類的情況下才會顯示。
* 局部變量*不能*具有*訪問修飾符*。
* 局部變量只能具有可以應用的最終非訪問修飾符。
<https://www.youtube.com/embed/WZRTwkCOYBQ?feature=oembed>
- JavaBeginnersTutorial 中文系列教程
- Java 教程
- Java 教程 – 入門
- Java 的歷史
- Java 基礎知識:Java 入門
- jdk vs jre vs jvm
- public static void main(string args[])說明
- 面向初學者的 Java 類和對象教程
- Java 構造器
- 使用 Eclipse 編寫 Hello World 程序
- 執行順序
- Java 中的訪問修飾符
- Java 中的非訪問修飾符
- Java 中的數據類型
- Java 中的算術運算符
- Java 語句初學者教程
- 用 Java 創建對象的不同方法
- 內部類
- 字符串構建器
- Java 字符串教程
- Java 教程 – 變量
- Java 中的變量
- Java 中的局部變量
- Java 中的實例變量
- Java 引用變量
- 變量遮蓋
- Java 教程 – 循環
- Java for循環
- Java 教程 – 異常
- Java 異常教程
- 異常處理 – try-with-resources語句
- Java 異常處理 – try catch塊
- Java 教程 – OOPS 概念
- Java 重載
- Java 方法覆蓋
- Java 接口
- 繼承
- Java 教程 – 關鍵字
- Java 中的this關鍵字
- Java static關鍵字
- Java 教程 – 集合
- Java 數組教程
- Java 集合
- Java 集合迭代器
- Java Hashmap教程
- 鏈表
- Java 初學者List集合教程
- Java 初學者的Map集合教程
- Java 初學者的Set教程
- Java 初學者的SortedSet集合教程
- Java 初學者SortedMap集合教程
- Java 教程 – 序列化
- Java 序列化概念和示例
- Java 序列化概念和示例第二部分
- Java 瞬態與靜態變量
- serialVersionUID的用途是什么
- Java 教程 – 枚舉
- Java 枚舉(enum)
- Java 枚舉示例
- 核心 Java 教程 – 線程
- Java 線程教程
- Java 8 功能
- Java Lambda:初學者指南
- Lambda 表達式簡介
- Java 8 Lambda 列表foreach
- Java 8 Lambda 映射foreach
- Java 9
- Java 9 功能
- Java 10
- Java 10 獨特功能
- 核心 Java 教程 – 高級主題
- Java 虛擬機基礎
- Java 類加載器
- Java 開發人員必須知道..
- Selenium 教程
- 1 什么是 Selenium?
- 2 為什么要進行自動化測試?
- 3 Selenium 的歷史
- 4 Selenium 工具套件
- 5 Selenium 工具支持的瀏覽器和平臺
- 6 Selenium 工具:爭霸
- 7A Selenium IDE – 簡介,優點和局限性
- 7B Selenium IDE – Selenium IDE 和 Firebug 安裝
- 7C Selenium IDE – 突破表面:初探
- 7D Selenium IDE – 了解您的 IDE 功能
- 7E Selenium IDE – 了解您的 IDE 功能(續)。
- 7F Selenium IDE – 命令,目標和值
- 7G Selenium IDE – 記錄和運行測試用例
- 7H Selenium IDE – Selenium 命令一覽
- 7I Selenium IDE – 設置超時,斷點,起點
- 7J Selenium IDE – 調試
- 7K Selenium IDE – 定位元素(按 ID,名稱,鏈接文本)
- 7L Selenium IDE – 定位元素(續)
- 7M Selenium IDE – 斷言和驗證
- 7N Selenium IDE – 利用 Firebug 的優勢
- 7O Selenium IDE – 以所需的語言導出測試用例
- 7P Selenium IDE – 其他功能
- 7Q Selenium IDE – 快速瀏覽插件
- 7Q Selenium IDE – 暫停和反射
- 8 給新手的驚喜
- 9A WebDriver – 架構及其工作方式
- 9B WebDriver – 在 Eclipse 中設置
- 9C WebDriver – 啟動 Firefox 的第一個測試腳本
- 9D WebDriver – 執行測試
- 9E WebDriver – 用于啟動其他瀏覽器的代碼示例
- 9F WebDriver – JUnit 環境設置
- 9G WebDriver – 在 JUnit4 中運行 WebDriver 測試
- 9H WebDriver – 隱式等待
- 9I WebDriver – 顯式等待
- 9J WebDriver – 定位元素:第 1 部分(按 ID,名稱,標簽名稱)
- 9K WebDriver – 定位元素:第 2 部分(按className,linkText,partialLinkText)
- 9L WebDriver – 定位元素:第 3a 部分(按cssSelector定位)
- 9M WebDriver – 定位元素:第 3b 部分(cssSelector續)
- 9N WebDriver – 定位元素:第 4a 部分(通過 xpath)
- 9O WebDriver – 定位元素:第 4b 部分(XPath 續)
- 9P WebDriver – 節省時間的捷徑:定位器驗證
- 9Q WebDriver – 處理驗證碼
- 9R WebDriver – 斷言和驗證
- 9S WebDriver – 處理文本框和圖像
- 9T WebDriver – 處理單選按鈕和復選框
- 9U WebDriver – 通過兩種方式選擇項目(下拉菜單和多項選擇)
- 9V WebDriver – 以兩種方式處理表
- 9W WebDriver – 遍歷表元素
- 9X WebDriver – 處理警報/彈出框
- 9Y WebDriver – 處理多個窗口
- 9Z WebDriver – 最大化窗口
- 9AA WebDriver – 執行 JavaScript 代碼
- 9AB WebDriver – 使用動作類
- 9AC WebDriver – 無法輕松定位元素? 繼續閱讀...
- 10A 高級 WebDriver – 使用 Apache ANT
- 10B 高級 WebDriver – 生成 JUnit 報告
- 10C 高級 WebDriver – JUnit 報表自定義
- 10D 高級 WebDriver – JUnit 報告自定義續
- 10E 高級 WebDriver – 生成 PDF 報告
- 10F 高級 WebDriver – 截屏
- 10G 高級 WebDriver – 將屏幕截圖保存到 Word 文檔
- 10H 高級 WebDriver – 發送帶有附件的電子郵件
- 10I 高級 WebDriver – 使用屬性文件
- 10J 高級 WebDriver – 使用 POI 從 excel 讀取數據
- 10K 高級 WebDriver – 使用 Log4j 第 1 部分
- 10L 高級 WebDriver – 使用 Log4j 第 2 部分
- 10M 高級 WebDriver – 以無頭模式運行測試
- Vue 教程
- 1 使用 Vue.js 的 Hello World
- 2 模板語法和反應式的初探
- 3 Vue 指令簡介
- 4 Vue Devtools 設置
- 5 數據綁定第 1 部分(文本,原始 HTML,JavaScript 表達式)
- 6 數據綁定第 2 部分(屬性)
- 7 條件渲染第 1 部分(v-if,v-else,v-else-if)
- 8 條件渲染第 2 部分(v-if和v-show)
- 9 渲染列表第 1 部分(遍歷數組)
- 10 渲染列表第 2 部分(遍歷對象)
- 11 監聽 DOM 事件和事件修飾符
- 12 監聽鍵盤和鼠標事件
- 13 讓我們使用簡寫
- 14 使用v-model進行雙向數據綁定
- 15 表單輸入綁定
- 18 類綁定
- Python 教程
- Python 3 簡介
- Python 基礎知識 - 又稱 Hello World 以及如何實現
- 如何在 Windows 中安裝 python
- 適用于 Windows,Mac,Linux 的 Python 設置
- Python 數字和字符串
- Python 列表
- Python 集
- Python 字典
- Python 條件語句
- Python 循環
- Python 函數
- 面向對象編程(OOP)
- Python 中的面向對象編程
- Python 3 中的異常處理
- Python 3:猜數字
- Python 3:猜數字 – 回顧
- Python 生成器
- Hibernate 教程
- Hibernate 框架基礎
- Hibernate 4 入門教程
- Hibernate 4 注解配置
- Hibernate 4 的實體關系
- Hibernate 4 中的實體繼承模型
- Hibernate 4 查詢語言
- Hibernate 4 數據庫配置
- Hibernate 4 批處理
- Hibernate 4 緩存
- Hibernate 4 審計
- Hibernate 4 的并發控制
- Hibernate 4 的多租戶
- Hibernate 4 連接池
- Hibernate 自舉