關於Java的權限修飾符(public,private,protected,默認friendly)


以前對訪問修飾符總是模棱兩可,讓自己仔細解釋也是經常說不很清楚.這次要徹底的搞清楚.

現在總結如下: 

一.概括總結 各個訪問修飾符對不同包及其子類,非子類的訪問權限

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM