Java訪問修飾符
Java關於訪問權限的關鍵字有三個:private、protected以及public,同時Java還有一個默認的訪問權限——包權限,所以Java總共有四種訪問權限控製。
public和private沒什麼好說的,public允許在所有地方訪問,而private隻能在本類以及內部類中進行訪問。
容易混淆的是protected和默認的訪問權限,時間長了就不太容易表述兩者的差別,下麵通過一個例子來說明這兩者的差別。
基類位於包main.access下,代碼如下:
package main.access;
public class BaseClass {
protected void protectedMethod() {
System.out.println("protected method");
}
void defaultMethod() {
System.out.println("default method");
}
}
在包main.access下還有一個子類SamePackage和非子類SamePackage,代碼如下:
package main.access;
public class SamePackage extends BaseClass{
public void foo() {
protectedMethod();
defaultMethod();
}
public static void main(String args[]) {
BaseClass baseClass = new BaseClass();
baseClass.protectedMethod();
baseClass.defaultMethod();
}
}
package main.access;
public class SamePackage {
public static void main(String args[]) {
BaseClass baseClass = new BaseClass();
baseClass.protectedMethod();
baseClass.defaultMethod();
}
}
在另一個包test.access中有一個類DiferentPackage
package test.access;
import main.access.BaseClass;
public class DiferentPackage extends BaseClass {
public void foo() {
protectedMethod();
defaultMethod(); // error
}
public static void main(String[] args) {
BaseClass baseClass = new BaseClass();
baseClass.protectedMethod(); //error
baseClass.defaultMethod(); //error
}
}
在main.access的子包main.access.sub下還有一個類SubPackage,其代碼如下:
package main.access.sub;
import main.access.BaseClass;
public class SubPackage extends BaseClass {
public void foo() {
protectedMethod();
defaultMethod(); // error
}
public static void main(String args[]) {
BaseClass baseClass = new BaseClass();
baseClass.protectedMethod(); // error
baseClass.defaultMethod(); // error
}
}
結論:在包相同的類中,protected和默認的訪問權限均可見,無論子類或者非子類;包不相同時,protected在子類中可見,而默認的訪問權限在子類中不可見。
默認的接口訪問權限是什麼?
public interface InterfaceAccess {
void foo();
}
是和類一樣的默認訪問權限嗎?來看看字節碼吧
Compiled from "InterfaceAccess.java"
public interface main.access.InterfaceAccess {
public abstract void foo();
}
字節碼中已經使用public abstract替代,所以“默認”(不寫)在接口中是public,而不是我們通常理解的包訪問權限,它不同於類的字節碼,
Compiled from "BaseClass.java"
public class main.access.BaseClass {
public main.access.BaseClass();
protected void protectedMethod();
void defaultMethod();
}
所以寫接口的時候不要“畫蛇添足”地增加訪問修飾符,編譯器會幫我們做好增加修飾符的工作。
總結
來個圖
畫出圖來之後就挺好記的。
關於訪問修飾符使用的tips
1、訪問修飾符盡可能從嚴使用,能用private就不要用protected,能用protected就不要用public;
2、接口一般不要使用訪問修飾符;
3、待你們來續...
最後更新:2017-08-13 22:48:56