以前對訪問修飾符總是模棱兩可,讓自己仔細解釋也是經常說不很清楚.這次要徹底的搞清楚.
現在總結如下:
一.概括總結 各個訪問修飾符對不同包及其子類,非子類的訪問權限
Java訪問權限修飾符包含四個:public,protected,friendly,private;但是,friendly在java中並沒有顯示的聲明,成員變量和方法默認情況下就是friendly權限。
現在把它們的訪問權限表示出來:(目前展示訪問修飾符的方式主要有兩種)
表示圖一:(第一種展示方式,把不同的類文件分為兩個變量,"是否是相同包","是否是子類".這樣總共2*2=4種情況再加上本類的訪問,總共5種情況都考慮進入了.我比較贊成這種分類的方式.簡單明了,容易理解.)
表示圖二:(這種展示方式也不錯.這種展示方式多了一層,同一個類中的訪問條件,但是同包中的子類和非子類統一了,Java的各個訪問修飾符在同包子類和非子類的訪問效果上是一樣的,可以合並)
訪問修飾符 |
同一個類 |
同包 |
不同包,子類 |
不同包,非子類 |
private |
√ |
|
|
|
默認 |
√ |
√ |
|
|
protected |
√ |
√ |
√ |
|
public |
√ |
√ |
√ |
√
|
二.首先,說明public的權限問題
定義4個類Person、People、Student、Computer,分別比較本類、同包、子類、其他包的區別。
這里要注意:當重寫父類成員函數時,子類的成員函數不能比父類的成員函數權限小,一般重寫把權限定義相同即可。
代碼如圖所示:
1.public 同類訪問

2.public 同包不同類訪問(非子類)
3.public 同包不同類訪問(子類)
4.public 不同包下的非子類訪問:
5.public 不同包下的子類訪問:
以上關於成員變量name都沒有編譯錯誤,說明public類型在這五種情況下都是沒有問題的.
三.再說protected 權限的問題.
附錄Person.java 截圖
四.default(frienddly)權限問題.
同樣定義4個類Person、People、Student、Computer,分別比較本類、同包、子類、其他包的區別。
這里要注意:default(不寫默認指定default)同public一樣可以修飾任何類而且類名要與文件名相同。
其他幾個類的代碼和public測試中的一樣.
這里只附錄其中一個出錯Student中的代碼和錯誤.
Person、People,Teacher類能編譯通過,就說明用default修飾的類在本類、同包中互相訪問都是可以的,而Student、Computer編譯不通過說明default不可以在包外,不管有沒有繼承關系的類都不可以互相訪問。
五:最后測試private權限問題,
private意思是私有的,如果Person能編譯通過而People、Student、Teacher,Computer編譯不通過,就說明用private修飾的類只能在本類中訪問。測試結果如下:
綜上所述,java中4種修飾符訪問權限的區別及詳解全過程就此演示完了,再一次說明java語言的嚴謹性和安全性,我們在以后使用這4中修飾符時創建一個類,這個類的權限盡量要小,這樣才能減少漏洞和提高安全性,從而體現java面向對象的封裝性。
最后如圖再回憶一下java中4個修飾符的訪問權限:
===========================================================
補充:
一.訪問權限修飾符修飾類名:
1,不能用protected和private修飾類。(上圖可以看到修飾類名的修飾符只有 public abstract 和final可以.)
2,用friendly修飾的類叫友好類,在另外一個類中使用友好類創建對象時,要保證它們在同一包中。(上面可以看出用default修飾的在包外都是無法訪問的.)
二.訪問權限修飾符與繼承
這里的訪問修飾符指的是修飾成員變量和方法。可以分為兩種情況:
1,子類與父類在同一包中
此時只有聲明為private的變量與方法不能被繼承(訪問)。
class Father { private int money ; int weight=100; } class Son extends Father { viod f() { money=10000;// 非法 weight=100; // 合法 } }
2,子類與父類不在同一包中
此時private與friendly均不能被繼承(訪問), protected與public可以。
Father.java
package com.aaa; public class Father { int height ; protected int money=120; public int weight; protected int getMoney() { return money; } void setMoney(int newMoney) { money=newMoney; } }
Son.java
package com.bbb; import com.aaa.Father; public class Son extends Father { void f() { money=10000;//合法 //height=170;//非法,height為friendly修飾的變量 System.out.println(money);//輸出結果是10000 //setMoney(300); //非法 int number=getMoney(); //合法 System.out.println(number);//輸出結果是10000 } public static void main(String args[]) { Son sss=new Son(); sss.f(); } }
所以,訪問權限修飾符權限從高到低排列是public ,protected ,friendly, private。
上面這個繼承的問題實際還是訪問修飾符的權限問題.
1、public:public表明該數據成員、成員函數是對所有用戶開放的,所有用戶都可以直接進行調用。
2、protected:protected對於子女、兄弟來說,就是public的,可以自由使用,沒有任何限制,而對於其他的外部class,protected就變成private。
3、default(friendly):java的默認訪問權限,這種權限通常被稱為包訪問權限,default對於兄弟來說,就是public的,在包之外,這些成員就變成private。
4、private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用。其他類想訪問可以通過該類的成員方法訪問如get/set