存取層級修飾符決定其他類是否可以訪問該類的某個欄位或某個方法。
有兩種存取控制種類;
1.Top Level(針對類的修飾)
包括public和package-private(不明確指定修飾符,什麼都不寫,即預設情況)兩種修飾符;
2.Member Level(針對成員的修飾)
包括public,private,protect,package-private四種修飾符。
對於類的存取控制,public表示被修飾的類對任何地方的類都可見。如果不寫存取修飾詞,即package-private情況,被修飾類只對該類所屬包的類可見。
對於成員的存取控制,public和package-private的定義和類的存取控制完全一樣,成員新增了兩個存取修飾詞分別是private和protect,private表示該成員只能被所屬的類訪問,protect包括了package-private的可見度,多出了對該類子類的可見度,子類可以在該類的同一個包,也可以在其他包。
JAVA的存取控制看上去還是很簡單,但有一點我覺得有點迷惑,就是如果一個類的存取修飾詞為package-private(不明確指定修飾符),那麼該類的成員比如一個方法的修飾符定義為public有什麼意義?因為該類在別的包都不能訪問了,那該類的方法肯定也就無法調用了。但是這樣定義程式並不報錯,因此肯定有其存在的道理。在網上搜尋了一下類似的疑問,發現了一個很好例子可以解釋這個疑問。
代碼package test;
public abstract class Test {
public abstract void test();
public static Test getInstance(){
return new SubTest();
}
}
class SubTest extends Test{
@Override
public void test() {
System.out.println("SubTest's test()");
}
}
測試用代碼:
import test.Test;
public class Main {
public static void main(String[] args) {
Test t = Test.getInstance();
t.test();
}
}
這是現在我知道的唯一一種可以讓package-private修飾的類的public或protect方法可以被其他包訪問的方法,我想這樣寫是因為可以間接實現讓一個子類重寫的方法的存取層級較父類的方法降低,因為重寫方法降低存取層級是不允許的。這樣假設繼承或實現了一個public方法,但是可以讓其他包無法得知他的方法,除非通過其父類來訪問。算是增加了存取控制的靈活性。