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是可以用來修飾内部類的。