package:包訪問權限
如果不提供任何訪問權限修飾詞,則意味着它是包訪問權限。
默認訪問權限沒有任何關鍵字,但通常是指包訪問權限(有時也表示為friendly)。這意味着包中所有其他類都可以訪問這個成員或方法,但是這個包之外的所有類不可以訪問。
例:
com.notes.packages.test.Info
| package com.notes.packages.test; public class Info { void print() { System.out.println("default method -- print()"); } } |
com.notes.packages.test.PublicDemo01
| package com.notes.packages.test; public class PublicDemo01 { public static void main(String[] args) { Info x = new Info(); x.print(); } } |
PublicDemo01和Info在同一個包下,可以訪問Info的default級別的方法——print()。
com.notes.packages.PublicDemo02
| package com.notes.packages; import com.notes.packages.test.Info; public class PublicDemo02 { public static void main(String[] args) { Info x = new Info(); // x.print(); // Error } } |
PublicDemo02和Info不在一個包下,不可以訪問Info的包訪問權限級別的方法——print()。
public:接口訪問權限
使用public關鍵字,就意味着被聲明的成員或方法對所有人都是可以訪問的。
例:如果將default級別權限例子中的print()方法權限設為public,則PublicDemo02可以訪問。
| package com.notes.packages.test; public class Info { public void print() { System.out.println("public method -- print()"); } } |
private:無法訪問
使用private關鍵字,就意味着被聲明的成員或方法,除了本類,其他任何類都無法訪問。
應用場景:單例模式
protected:繼承訪問權限
新類(稱之子類或派生類)通過繼承可以復用一個現有類(稱之父類或基類),然后擴展基類的成員、方法。有時,基類的創建者會希望某個特定成員,將它的訪問權限賦予派生類而不是所有類。public無法做到這一點,為此,引入了protected來完成這一工作。protected也提供包訪問權限,也就是說,派生類以及相同包內的其他類都可以訪問protected成員或方法。
例:子類繼承父類后,可以訪問父類的protected成員。
| class Father { private String a = "private"; protected String b = "protected"; public String c = "public"; };
class Son extends Father { public void print() { // System.out.println("element a:" + super.a); // Error System.out.println("element b:" + super.b); System.out.println("element c:" + super.c); } }
public class ProtectedDemo01 { public static void main(String args[]) { Son sub = new Son(); sub.print(); } }; |
總結
前面各個例子中展示了類的成員、方法都可以用各種權限修飾詞來修飾。
除此之外,還有一些需要注意的點:
(1) 靜態成員、靜態方法的權限修飾詞的用法和普通成員、方法一樣。
(2) 類雖然也可以被修飾詞修飾,但是不可以用private、protected兩個權限修辭詞。
(3) 有些書中將包訪問權限又叫做默認訪問權限。個人不建議這么去記,因為這很容易與Java Se8中新特性——default關鍵字混淆。這個關鍵字只能用於Interface,作用是允許程序員在Interface中定義接口的默認具體實現(以往的JDK版本是不允許這樣的,你只能在接口中聲明方法)。

