本例透過三個位於不同套件的類別,示範 Java 四種存取修飾子(public、protected、default、private)對成員方法的可見性影響。重點在於同一套件與不同套件(含子類別)的存取差異。
// 套件 e8.com
package e8.com;
public class ClassDemo1 {
// 公有方法:任何類別可存取
public void method1() {
System.out.println("這是公有方法!任何類別都可以存取。");
}
// 受保護方法:同套件或子類別可存取
protected void method2() {
System.out.println("這是受保護方法!只有同套件或子類別可存取。");
}
// 私有方法:僅本類別可存取
private void method3() {
System.out.println("這是私有方法!只有類別本身可存取。");
}
public static void main(String[] args) {
ClassDemo1 d = new ClassDemo1();
d.method1(); d.method2(); d.method3(); // 全部可存取
}
}
// 同套件 e8.com 的另一個類別
package e8.com;
public class ClassPlay {
public static void main(String[] args) {
ClassDemo1 d = new ClassDemo1();
d.method1(); // OK
d.method2(); // OK(同套件)
d.method3(); // 編譯錯誤:private 不可存取
}
}
// 不同套件 e8.net 的類別(非子類別)
package e8.net;
import e8.com.*;
public class ClassPlay {
public static void main(String[] args) {
ClassDemo1 d = new ClassDemo1();
d.method1(); // OK
d.method2(); // 編譯錯誤:不同套件且非子類別,protected 不可存取
d.method3(); // 編譯錯誤
}
}
| 修飾子 | 同一類別 | 同一套件 | 不同套件的子類別 | 不同套件非子類別 |
|---|---|---|---|---|
public | ✔ | ✔ | ✔ | ✔ |
protected | ✔ | ✔ | ✔ | ✘ |
default (無) | ✔ | ✔ | ✘ | ✘ |
private | ✔ | ✘ | ✘ | ✘ |
ClassDemo1 內部可呼叫所有方法。e8.com.ClassPlay 可存取 public、protected、default 成員,但不可存取 private。e8.net.ClassPlay 僅能存取 public 成員;protected 僅限繼承關係的子類別存取(此處非子類別故失敗)。e8.net 中有類別繼承 ClassDemo1,則該子類別可存取 protected 方法。private,僅對外暴露必要的 public API。protected。default(包私有)減少公開介面。