1. 程式人生 > >java中private,public,protected詳解

java中private,public,protected詳解

轉載:https://blog.csdn.net/aimeimeits/article/details/54136219

訪問級別

訪問級別修飾符確定其他類是否可以使用特定欄位或呼叫特定方法。有兩個級別的訪問控制:

1.在頂級

 - public或package-private(沒有顯式修飾符即預設許可權)。

類可以用修飾符public宣告,在這種情況下,類對所有類都可見。如果一個類沒有修飾符(預設,也稱為package-private),它只在自己的包中可見。

 

2.在成員級別 

 

- public,private,protected或package-private(沒有顯式修飾符即預設許可權)。

在成員級別,也可以使用public修飾符或無修飾符(package-private),如同頂級類一樣,具有相同的含義。

對於成員,除public和預設外有兩個附加的訪問修飾符:private和protected:

private修飾符指定該成員只能在其自己的類中訪問。

protected修飾符指定該成員只能在其自己的包(如package-private)中訪問,此外還可以由另一個包中的該類的子類訪問。

 

下表顯示了對每個修飾符允許的成員的訪問許可權。


第一列指示類本身是否有權訪問由訪問級別定義的成員。正如你可以看到,一個類總是有權訪問它自己的成員。

第二列指示與該類(不管其父級)相同的包

中的類是否具有對成員的訪問許可權。

第三列指示在此包外部宣告的該類的子類是否有權訪問成員。

第四列指示是否所有類都具有對成員的訪問許可權。

訪問級別通過兩種方式影響您

當您使用來自另一個源(例如Java平臺中的類)的類時,訪問級別將確定您自己的類可以使用的那些類的哪些成員

第二,當你寫一個類時,你需要決定每個成員變數和類中的每個方法應該具有什麼訪問級別。

 

讓我們看一下類的集合,看看訪問級別如何影響可見性。下圖顯示了此示例中的四個類以及它們之間的關係。

此例中:

One包有Alpha和Beta兩個類,Two包中有AlphaSub和Gamma類,其中AlphaSub繼承Alpha

下表顯示了Alpha類的成員(成員變數、成員函式)對於可應用於它們的每個訪問修飾符的可見性。

Alpha類內所有成員都可以訪問

Beta與Alpha在同一包中,因而Alpha的私有成員Beta不能訪問

Alphasub與Alpha不在同一包中,但AlphaSub是Alpha的子類,因而AlphaSub不能訪問Alpha的預設和私有成員

Gamma與Alpha位於不同包且無繼承關係,因而Gamma只能訪問Alpha的public成員

 

選擇訪問級別的提示:

如果其他程式設計師使用你的類,你想要確保不會發生濫用錯誤。訪問級別可以幫助您這樣做。

1.使用對特定成員有意義的最嚴格的訪問級別。使用私人,除非你有一個很好的理由不使用。

2.避免使用公共欄位(常量除外)。 (本教程中的許多示例使用公共欄位。這可能有助於簡要說明一些要點,但不推薦用於生產程式碼。)公共欄位往往會將您連結到特定實現

並限制您在更改程式碼時的靈活性。

 

參照甲骨文的java文件:點選開啟連結

 

文件看完了就實際編寫例子驗證一下吧(只驗證了成員函式):

其中每個類中的test方法是用來測試的

Alpha.java

分別定義了四個public,protected、預設,private許可權的方法

 

 
  1. package com.one;

  2.  
  3. public class Alpha

  4. {

  5. public void test()

  6. {

  7. this.pub();

  8. this.pro();

  9. this.def();

  10. this.pri();

  11. }

  12.  
  13. public void pub()

  14. {

  15. System.out.println( "public");

  16. }

  17.  
  18. protected void pro()

  19. {

  20. System.out.println( "protected");

  21. }

  22.  
  23. void def()

  24. {

  25. System.out.println( "default");

  26. }

  27.  
  28. private void pri()

  29. {

  30. System.out.println( "private");

  31. }

  32. }

 

 

Beta.java

和Alpha在同一包下

 

 
  1. package com.one;

  2.  
  3. public class Beta

  4. {

  5. public void test()

  6. {

  7. Alpha alpha = new Alpha();

  8. alpha.pub();

  9. alpha.pro();

  10. alpha.def();

  11. alpha.pri();

  12. }

  13.  
  14. }

 

 

AlphaSub.java

AlphaSub作為Alpha的子類,用super進行驗證。

 

 
  1. package com.two;

  2. import com.one.Alpha;

  3.  
  4. public class AlphaSub extends Alpha

  5. {

  6. public void test()

  7. {

  8. super.pub();

  9. super.pro();

  10. super.def();

  11. super.pri();

  12. }

  13. }

 

 

Gamma.java

與Alpha不同包且無繼承關係

 

 
  1. package com.two;

  2. import com.one.Alpha;

  3.  
  4. public class Gamma

  5. {

  6. public void test()

  7. {

  8. Alpha alpha = new Alpha();

  9. alpha.pub();

  10. alpha.pro();

  11. alpha.def();

  12. alpha.pri();

  13. }

  14. }


接下來就開始驗證:

 

1.驗證Alpha類

 

 
  1. import com.one.Alpha;

  2.  
  3. class Test

  4. {

  5. public static void main(String[] args)

  6. {

  7. new Alpha().test();

  8. }

  9. }

分別編譯Alpha.java和Test.java:

 

 

 
  1. F:\javaStuff>javac -d F:\javaStuff Alpha.java

  2.  
  3. F:\javaStuff>javac Test.java

  4.  
  5. F:\javaStuff>java Test

  6. public

  7. protected

  8. default

  9. private

編譯沒有報錯,即證明四種訪問許可權在類內都是可以訪問的

 

 

2.驗證Beta類

依次編譯Alpha.java和Beta.java

 

 
  1. F:\javaStuff>javac -d F:\javaStuff Alpha.java

  2.  
  3. F:\javaStuff>javac -d F:\javaStuff Beta.java

  4. Beta.java:11: 錯誤: pri()可以在Alpha中訪問private

  5. alpha.pri();

  6. ^

  7. 1 個錯誤


可以看到編譯Beta,java時報錯,提示Alpha類中的pro方法是私有的,不可訪問
 

 

3.驗證AlphaSub類

依次編譯Alpha.java和AlphaSub.java

 

 
  1. F:\javaStuff>javac -d F:\javaStuff Alpha.java

  2.  
  3. F:\javaStuff>javac -d F:\javaStuff AlphaSub.java

  4. AlphaSub.java:10: 錯誤: def()在Alpha中不是公共的; 無法從外部程式包中對其進行訪問

  5. super.def();

  6. ^

  7. AlphaSub.java:11: 錯誤: pri()可以在Alpha中訪問private

  8. super.pri();

  9. ^

  10. 2 個錯誤

編譯報錯

 

Alpha的def方法為預設許可權無法在外部包訪問

Alpha的pri方法為私有許可權無法在外部包訪問
 

4.驗證Gamma類

依次編譯Alpha.java和Gamma.java

 

 
  1. F:\javaStuff>javac -d F:\javaStuff Alpha.java

  2.  
  3. F:\javaStuff>javac -d F:\javaStuff Gamma.java

  4. Gamma.java:10: 錯誤: pro()可以在Alpha中訪問protected

  5. alpha.pro();

  6. ^

  7. Gamma.java:11: 錯誤: def()在Alpha中不是公共的; 無法從外部程式包中對其進行訪問

  8. alpha.def();

  9. ^

  10. Gamma.java:12: 錯誤: pri()可以在Alpha中訪問private

  11. alpha.pri();

  12. ^

  13. 3 個錯誤

3個錯誤

 

 

Alpha的def方法為預設許可權無法在外部包訪問

Alpha的pri方法為私有許可權無法在外部包訪問

Alpha的pro方法為保護方法無法被外部非子類訪問
 

程式碼的目錄結構如下



因為編譯Beta、AlphaSub和Gamma時都有編譯錯誤自然就不會生成com.two包了