天天看點

Java的通路控制符詳解(結合代碼示範)

概述

Java是使用“通路控制符”來控制哪些細節需要封裝,哪些細節是需要暴露的。Java中四種“通路控制符”說明了面向對象的封裝性,是以我們要利用它們盡可能的讓通路權限降到最低,進而提高安全性。

修飾符 同類 同包 子類 所有類
private *
default * *
protected * * *
public * * * *

下面歸納一下Java用于控制可見性的4個通路修飾符:同包同類中,可以自由通路protected成員

1.private 表示私有,隻有自己類能通路

2.default 表示沒有修飾符修飾,隻有同一個包的類能通路

3.protected 表示可以被同一個包的類以及其他包中的子類通路

4.public 表示可以被該項目的所有包中的所有類通路

結合代碼詳解

下面通過代碼測試對Java中4種通路權限修飾符的差別做進一步的說明

首先我們建立4個類:

a1

,

a2

,

b1

,

b2

,分别比較其在本類、本包、子類、其他包的差別

代碼結構:

Java的通路控制符詳解(結合代碼示範)

public

Java的通路控制符詳解(結合代碼示範)
Java的通路控制符詳解(結合代碼示範)
Java的通路控制符詳解(結合代碼示範)
Java的通路控制符詳解(結合代碼示範)

以上可以說明 public 修飾符的通路權限為:該項目的所有包中的所有類。

protected

Java的通路控制符詳解(結合代碼示範)

隻有 b1 編譯不通過,說明 protected 修飾符的通路權限為:同一包中的類和不同包下的子類。

不過注意,到這兒還沒完!!!

關于 protected 有兩個細節需要特别強調一下:

1.若父類和子類在同一個包中,子類可通路父類的protected成員,也可通路父類對象的peotected成員。

2.若子類和父類不再同一個包中,子類可通路父類的protected成員,不能通路父類對象的protected成員。

對于初學者可能不太好了解,下面看代碼就明白了

Java的通路控制符詳解(結合代碼示範)

default

所謂預設,也就是什麼都不加

Java的通路控制符詳解(結合代碼示範)

由此可以說明,default 修飾符的通路權限為: 同一個包中的類

private

Java的通路控制符詳解(結合代碼示範)

這個就不必多說了吧,private修飾符的通路權限為:同一個類

小結

  • 同包不同類中,無任何繼承關系,可以自由通路protected成員
  • 同包不同類中,具有繼承關系,任何子類或者子類的子類都可以通路protected成員
  • 不同包不同類中,不具有繼承關系,不可以通路其它類protected成員
  • 不同包不同類中,具有繼承關系,子類可以通路父類protected成員。但是父類對象不可以通路自己的protected成員,否則報這樣的錯誤:The method speak(Object) from the type Person is not visible
  • 不同包不同類中,具有繼承關系,間接子類中除該類對象自己外,它的直接父類,以及間接父類都不可以通路自己的protected成員。