標籤:div 其他 count code 可見度 控制 abstract 範圍 int
引言
??Java中的存取權限理解起來不難,但完全掌握卻不容易,特別是4種存取權限並不是任何時候都可以使用。下面整理一下,在什麼情況下,有哪些存取權限可以允許選擇。
存取權限簡介
存取權限控制: 指的是本類及本類內部的成員(成員變數、成員方法、內部類)對其他類的可見度,即這些內容是否允許其他類訪問。
Java 中一共有四種存取權限控制,其許可權控制的大小情況是這樣的:public > protected > default(包存取權限) > private ,具體的許可權控制看下面表格,列所指定的類是否有許可權允許訪問行的許可權控制下的內容:
存取權限 |
本類 |
本包的類 |
子類 |
非子類的外包類 |
public |
是 |
是 |
是 |
是 |
protected |
是 |
是 |
是 |
否 |
default |
是 |
是 |
否 |
否 |
private |
是 |
否 |
否 |
否 |
存取權限控制的使用情境
存取權限使用的情境可以總結為下面的四種情境,分別對存取權限的使用有不同的限制:
1. 外部類的存取控制
外部類(外部介面) 是相對於內部類(也稱為嵌套類)、內部介面而言的。外部類的存取控制只能是這兩種:public 、default 。
//public 訪問呢許可權的外部類,所有類都可以使用這個類public class OuterClass {}//default 許可權的外部介面,所有類、介面均可以使用此介面interface OuterInterface{ }
2. 類裡面的成員的存取控制
類裡面的成員分為三類 : 成員變數、成員方法、成員內部類(內部介面)
類裡面的成員的存取控制可以是四種,也就是可以使用所有的存取控制許可權
public class OuterClass { public int aa; //可以被所有的類訪問 protected boolean bb; //可以被所有子類以及本包的類使用 void cc() { //default 存取權限,能在本包範圍內使用 System.out.println("包存取權限"); } //private許可權的內部類,即這是私人的內部類,只能在本類使用 private class InnerClass{ }}
注意:
這裡的類裡面的成員 是指類的全域成員,並沒有包括局部的成員(局部變數、局部內部類,沒有局部內部介面)。或者說,局部成員是沒有存取權限控制的,因為局部成員只在其所在的範圍內起作用,不可能被其他類訪問到。
public void count(){ //局部成員變數 public int amount;//編譯無法通過,不能用public修飾 int money;//編譯通過 //局部嵌套介面 class customer{//編譯通過 }}
上面的兩種情境幾乎可以適應所有的情況,但有一些情況比較特殊,還做了有些額外存取權限的要求
3. 抽象方法的存取權限
普通方法是可以使用四種存取權限的,但抽象方法是有一個限制:不能用private 來修飾,也即抽象方法不能是私人的,否則,子類就無法繼承實現抽象方法。
4. 介面成員的存取權限
介面由於其的特殊性,所有成員的存取權限都規定得死死的,下面是介面成員的存取權限:
- 變數: public static final
- 方法: public abstract
- 內部類、內部介面 : public static
也因為所有的一切都預設強制規定好了,所以我們在用的時候,並不一定需要完整寫出所有的修飾符,編譯器會幫我們完成的,也就是,可以少寫修飾符,但不能寫錯修飾符。
public interface Interface_Test { public int aa = 6; //少寫了 static final int bb = 5; // //嵌套介面,可以不寫public static interface cc{ }}
java基礎(七) java四種存取權限