概述
Java是使用“通路控制符”來控制哪些細節需要封裝,哪些細節是需要暴露的。Java中四種“通路控制符”說明了面向對象的封裝性,是以我們要利用它們盡可能的讓通路權限降到最低,進而提高安全性。
修飾符 | 同類 | 同包 | 子類 | 所有類 |
---|---|---|---|---|
private | * | |||
default | * | * | ||
protected | * | * | * | |
public | * | * | * | * |
下面歸納一下Java用于控制可見性的4個通路修飾符:同包同類中,可以自由通路protected成員
1.private 表示私有,隻有自己類能通路
2.default 表示沒有修飾符修飾,隻有同一個包的類能通路
3.protected 表示可以被同一個包的類以及其他包中的子類通路
4.public 表示可以被該項目的所有包中的所有類通路
結合代碼詳解
下面通過代碼測試對Java中4種通路權限修飾符的差別做進一步的說明
首先我們建立4個類:
a1
,
a2
,
b1
,
b2
,分别比較其在本類、本包、子類、其他包的差別
代碼結構:

public
以上可以說明 public 修飾符的通路權限為:該項目的所有包中的所有類。
protected
隻有 b1 編譯不通過,說明 protected 修飾符的通路權限為:同一包中的類和不同包下的子類。
不過注意,到這兒還沒完!!!
關于 protected 有兩個細節需要特别強調一下:
1.若父類和子類在同一個包中,子類可通路父類的protected成員,也可通路父類對象的peotected成員。
2.若子類和父類不再同一個包中,子類可通路父類的protected成員,不能通路父類對象的protected成員。
對于初學者可能不太好了解,下面看代碼就明白了
default
所謂預設,也就是什麼都不加
由此可以說明,default 修飾符的通路權限為: 同一個包中的類
private
這個就不必多說了吧,private修飾符的通路權限為:同一個類
小結
- 同包不同類中,無任何繼承關系,可以自由通路protected成員
- 同包不同類中,具有繼承關系,任何子類或者子類的子類都可以通路protected成員
- 不同包不同類中,不具有繼承關系,不可以通路其它類protected成員
- 不同包不同類中,具有繼承關系,子類可以通路父類protected成員。但是父類對象不可以通路自己的protected成員,否則報這樣的錯誤:The method speak(Object) from the type Person is not visible
- 不同包不同類中,具有繼承關系,間接子類中除該類對象自己外,它的直接父類,以及間接父類都不可以通路自己的protected成員。