本篇文章總結一下Java的訪問修飾符,雖然這樣的總結在網上已經有很多了,但是作為基礎部分,還是要親自總結一下,才能加深記憶,本文中測驗使用的JDK版本是: 1.8.0_121-b13,JVM版本是:25.121-b13
文章目錄
- 1. 訪問修飾符有哪些,可以用在什么地方
- 2. 類訪問控制
- 2.1. public修飾的類
- 2.2. 默認修飾符修飾的類
- 3. 類中欄位和方法的訪問控制
- 3.1. 同一包下的訪問控制
- 3.2. 不同包下的訪問控制
- 4. 介面的訪問控制
- 4.1. 介面中的變數
- 4.2. 介面中的方法
- 4.3. 介面中的內部類和內部介面
- 5. 總結
1. 訪問修飾符有哪些,可以用在什么地方
Java中的訪問修飾符有四種,分別是public,protected,默認,private,主要作用是控制類之間的資料的訪問權限,這些修飾符可以修飾的Java元素有下面這些:
- 類
- 介面
- 類中的方法
- 介面中的方法
- 類中的欄位
- 介面中的欄位
注意,方法的形式引數和方法的區域變數是不可以使用權限修飾符修飾的,下面我們分別按照各個元素的維度看一下修飾符的權限控制效果,
2. 類訪問控制
Java中的類除了在一個java檔案中直接定義以外,還可以在一個類的內部定義類,這樣的類叫做內部類,內部類也有以下幾種:
- 成員內部類
- 靜態內部類
- 區域內部類
- 匿名內部類
對于在檔案中直接定義的類來講,可以使用public或默認(不寫)修飾符,不能使用private和protected,看下圖:

這是因為私有的類沒用意義,只能自己玩,不能與其他類互動,protected一般用于繼承時,對欄位和方法的控制,因此在外部定義的類使用protected修飾沒用意義,注意一個java檔案中,只能有一個public類出現,如果多于一個,剩下的類只能使用默認修飾符,如下圖:

成員內部類和靜態內部類都是在類中定義的,分別以一個實體成員和靜態成員的角色出現,這個我們講到類的成員訪問控制時再講,
2.1. public修飾的類
如果一個類定義成public的,那么在
- 類內部,
- 同包的非繼承類,
- 同包的繼承類,
- 非同包的非繼承類
- 非同包繼承類
這些場景中,能否訪問到這個類呢?
- 類內部,這個當然是可以的,在一個類內部可以參考當前的類,例如在類中宣告一個本類的參考

- 同包的非繼承類,我們現在,在同一包下,新建一個類ClassB,發現ClassB中也是可以參考的

經過測驗,public修飾的類在同包的繼承類,非同包的非繼承類,非同包繼承類中都是可以訪問的,這里就不在貼圖了,大家可以在下面驗證,
2.2. 默認修飾符修飾的類
其實,默認訪問權限的類,在本類中,同一包(不管有沒有繼承關系)中都是可以訪問的,但是在不同包中(不管有沒有繼承關系),是參考不了的,看下圖:

3. 類中欄位和方法的訪問控制
在類ClassA中定義了具有四種訪問控制權限欄位和方法,以及靜態欄位和靜態方法,代碼如下:
package com.victory.test.modifier_test.pkg1;
public class ClassA {
private int privateA=1;
int defaultA=3;
protected int protectedA=2;
public int publicA =4;
//---------------------------------------------------------------------
private static int staticPrivateA=1;
static int staticDefaultA=3;
protected static int staticProtectedA =2;
public static int staticPublicA =4;
//---------------------------------------------------------------------
private void privateFunction(){
}
void defaultFunction(){
}
protected void protectedFunction(){
}
public void publicFunction(){
}
//---------------------------------------------------------------------
private static void privateStaticFunction(){
}
static void defaultStaticFunction(){
}
protected static void protectedStaticFunction(){
}
public static void publicStaticFunction(){
}
}
3.1. 同一包下的訪問控制
在本類中,這些欄位和方法都是可以訪問的,不再贅述,然后在同一包中新建一個類ClassB,并在其構造方法中呼叫這些方法和訪問這些欄位,結果如下;

同一包中,除了私有的欄位和方法,其他的都可以訪問,如果讓ClassB繼承ClassA,會有什么變化呢?其實沒有什么變化的,可以得到如下結論:同一包下,private修飾的欄位和方法,只有在本類中才可以訪問,不同類(不管有沒有繼承關系)中不能訪問,對于默認,protected,public修飾的欄位和方法,本類其他類中都可以訪問,
3.2. 不同包下的訪問控制
下面再看在不同包下的情況,我們在pkg2包中定義一個類ClassC,還是在構造方法中呼叫這些方法和訪問這些欄位,結果如下;

如果讓ClassC繼承ClassA,結果會怎樣呢?結果如下:

4. 介面的訪問控制
介面和類的訪問權限很相似,在一個檔案中可以直接定義介面,且訪問修飾符只能是public和默認,且一個java檔案只能定義一個public修飾的介面,且默認訪問權限的介面,在不同包中不能被參考,在介面內部可以定義:
- 變數
- 方法
- 內部類
- 內部介面
4.1. 介面中的變數
介面中定義的變數其實都是靜態常量,且訪問修飾符是public,所以在介面中定義變數需要初始化(常量需要初始化),如圖:

為了進一步說明確實是常量,通過反射獲取這個欄位列印,

4.2. 介面中的方法
介面中的方法默認是 public abstract 修飾的,

JDK1.8以后,介面中支持default方法和static方法,都不是抽象方法,因此必須有方法體,且訪問修飾符都是public,static方法可以通過介面名稱直接呼叫,default方法可以被實作類重寫,

4.3. 介面中的內部類和內部介面
介面中也可以宣告內部類和內部介面,但是他們默認是public修飾的,且只能是public修飾的,

因此對于介面來說,有如下結論:
- 介面中的成員都是public的
- 當介面被默認修飾符修飾時,只有在同一包中才可以被參考,同時可以訪問介面中的變數和方法,其他包不能參考
- 當介面修飾符是public時,所有的包都可以參考,同時可以訪問介面中的變數和方法,
5. 總結
歸納上面的驗證,針對類中的欄位和方法,各個訪問權限修飾符的作用范圍如下:

OK,有關Java權限控制就總結到這里了,如果您發現文中的紕漏,歡迎告訴我,我及時更正,
如果您覺得本文對你有幫助,歡迎一鍵三聯支持一下,堅持記錄,不斷總結,我是張凱,一個善于總結的程式員,期待你的關注,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/271266.html
標籤:其他
上一篇:一個老程式員的一些職場經驗分享
下一篇:轉行軟體測驗?寫給迷惘的你
