考慮兩個場景:
ClassA,不希望專案中其他類都能存取它。ClassA 有 fun1、fun2 兩個方法,只想讓 fun1 對外可見。此時存取權限控制即可發揮作用。
default (package-private)、public、private、protected。
注意:只有 default 和 public 可修飾類(指內部類,不含外部類)。修飾類的變數與方法四種權限皆可使用。
該類僅對同一套件中的其他類可見。
該類對所有類可見。
// Main.java
package com.cxh.test1;
public class Main {
public static void main(String[] args) {
People people = new People("Tom");
System.out.println(people.getName());
}
}
// People.java
package com.cxh.test1;
class People { // default 類
private String name;
public People(String name) { this.name = name; }
public String getName() { return name; }
}
因同套件,Main 可看見 People,程式正常執行。
將 People 移至 com.cxh.test2,Main 會報錯「People not visible」。若將 People 改為 public,則可見。
| 修飾符 | 同套件 | 不同套件(非子類) | 不同套件(子類) |
|---|---|---|---|
| default | ✅ 可存取 | ❌ 不可存取 | ❌ 不可存取 |
| private | ❌ 僅本類 | ❌ | ❌ |
| protected | ✅ 可存取 | ❌ | ✅ 可存取 |
| public | ✅ 可存取 | ✅ 可存取 | ✅ 可存取 |
若 People 的 getName() 為 default,跨套件呼叫會報錯。
將方法改為 protected,同套件可存取;不同套件下,只有繼承 People 的子類(如 Man)能存取,無關類則不行。
public 類,檔名必須與該類名相同;若無 public 類,檔名可任意命名。