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許可權的方法
-
package com.one;
-
public class Alpha
-
{
-
public void test()
-
{
-
this.pub();
-
this.pro();
-
this.def();
-
this.pri();
-
}
-
public void pub()
-
{
-
System.out.println( "public");
-
}
-
protected void pro()
-
{
-
System.out.println( "protected");
-
}
-
void def()
-
{
-
System.out.println( "default");
-
}
-
private void pri()
-
{
-
System.out.println( "private");
-
}
-
}
Beta.java
和Alpha在同一包下
-
package com.one;
-
public class Beta
-
{
-
public void test()
-
{
-
Alpha alpha = new Alpha();
-
alpha.pub();
-
alpha.pro();
-
alpha.def();
-
alpha.pri();
-
}
-
}
AlphaSub.java
AlphaSub作為Alpha的子類,用super進行驗證。
-
package com.two;
-
import com.one.Alpha;
-
public class AlphaSub extends Alpha
-
{
-
public void test()
-
{
-
super.pub();
-
super.pro();
-
super.def();
-
super.pri();
-
}
-
}
Gamma.java
與Alpha不同包且無繼承關係
-
package com.two;
-
import com.one.Alpha;
-
public class Gamma
-
{
-
public void test()
-
{
-
Alpha alpha = new Alpha();
-
alpha.pub();
-
alpha.pro();
-
alpha.def();
-
alpha.pri();
-
}
-
}
接下來就開始驗證:
1.驗證Alpha類
-
import com.one.Alpha;
-
class Test
-
{
-
public static void main(String[] args)
-
{
-
new Alpha().test();
-
}
-
}
分別編譯Alpha.java和Test.java:
-
F:\javaStuff>javac -d F:\javaStuff Alpha.java
-
F:\javaStuff>javac Test.java
-
F:\javaStuff>java Test
-
public
-
protected
-
default
-
private
編譯沒有報錯,即證明四種訪問許可權在類內都是可以訪問的
2.驗證Beta類
依次編譯Alpha.java和Beta.java
-
F:\javaStuff>javac -d F:\javaStuff Alpha.java
-
F:\javaStuff>javac -d F:\javaStuff Beta.java
-
Beta.java:11: 錯誤: pri()可以在Alpha中訪問private
-
alpha.pri();
-
^
-
1 個錯誤
可以看到編譯Beta,java時報錯,提示Alpha類中的pro方法是私有的,不可訪問
3.驗證AlphaSub類
依次編譯Alpha.java和AlphaSub.java
-
F:\javaStuff>javac -d F:\javaStuff Alpha.java
-
F:\javaStuff>javac -d F:\javaStuff AlphaSub.java
-
AlphaSub.java:10: 錯誤: def()在Alpha中不是公共的; 無法從外部程式包中對其進行訪問
-
super.def();
-
^
-
AlphaSub.java:11: 錯誤: pri()可以在Alpha中訪問private
-
super.pri();
-
^
-
2 個錯誤
編譯報錯
Alpha的def方法為預設許可權無法在外部包訪問
Alpha的pri方法為私有許可權無法在外部包訪問
4.驗證Gamma類
依次編譯Alpha.java和Gamma.java
-
F:\javaStuff>javac -d F:\javaStuff Alpha.java
-
F:\javaStuff>javac -d F:\javaStuff Gamma.java
-
Gamma.java:10: 錯誤: pro()可以在Alpha中訪問protected
-
alpha.pro();
-
^
-
Gamma.java:11: 錯誤: def()在Alpha中不是公共的; 無法從外部程式包中對其進行訪問
-
alpha.def();
-
^
-
Gamma.java:12: 錯誤: pri()可以在Alpha中訪問private
-
alpha.pri();
-
^
-
3 個錯誤
3個錯誤
Alpha的def方法為預設許可權無法在外部包訪問
Alpha的pri方法為私有許可權無法在外部包訪問
Alpha的pro方法為保護方法無法被外部非子類訪問
程式碼的目錄結構如下
因為編譯Beta、AlphaSub和Gamma時都有編譯錯誤自然就不會生成com.two包了