天天看點

Java修飾符private,default,protected,public 差別的再辨識

Java通路控制符的含義和使用情況:

 類内部  本包  子類 外部包 
public    √  √  √  √
protected   √  √  √  ×
default(預設)    √  √  ×  ×
private   √  ×  ×  ×

相信大家在學習java基礎時都會碰見這個修飾符作用範圍表,但其實這個表格裡面的表述是有些含糊的,尤其是關于子類的部分。

經過本人的過濾分析,了解思路如下:

1、從private開始由小到大分為四個範圍程度,存取權限逐漸遞增;

2、private修飾的成員變量及方法隻能在本類中使用,可直接調用;

3、到default層次存取權限開放,使得同一包内的類(包括其本包内子類)便可通路此成員變量或方法;

4、目前為止,兩個層次的範圍為此類内及本包内,protected和public進一步開放外包通路權限;

5、其中protected開放處于外部包的子類對其的存取權限,而public則進一步開放所有外部包類對其的存取權限。

總結性表述:類内(private), 本包(default),外包(protected<僅僅開放外包子類>  ,public)

注意點:Java的通路控制是停留在編譯層的,也就是它不會在.class檔案中留下任何的痕迹,隻在編譯的時候進行通路控制的檢查。其實,通過反射的手段,是可以通路任何包下任何類中的成員,例如,通路類的私有成員也是可能的。

補充點:關于類的修飾符隻有default(預設)和 public,為什麼沒有private和protected?

理由很簡單, private 修飾的東西是基于類記憶體取,放置于一個包内的類自然就沒法變為私有的,因為它自身存在就是要被其他類來擷取。但有一種例外情況,如果是在一個類中放置的類(内部類)就可以使用private修飾符,關于内部類可以視為一個特殊的成員變量。

此外,protected可以用類似的邏輯思路來思考, protected是開放外部包的子類對其的存取權限,那前提條件就是此類被某子類擷取繼承,但一個被修飾為protected的類是不可能被某子類所擷取繼承的,這樣的思路就有點“遞歸”的味道了,其前提思路是永遠沒辦法達到的。同樣的,protected是可以用來修飾内部類的。

繼續閱讀