面向對象編程(OOP)核心在於「封裝、繼承、多態」。本文聚焦封裝,闡述其定義、優勢、訪問修飾符規則,並通過實例展示如何設計高內聚、低耦合的類。
封裝是將類的內部實現細節隱藏,僅對外暴露公共介面(方法)。核心做法:
private),禁止外部直接讀寫。| 修飾符 | 同類 | 同包 | 子類(異包) | 所有類 | 適用場景 |
|---|---|---|---|---|---|
private | ✓ | ✗ | ✗ | ✗ | 內部實現細節,絕不對外暴露 |
default (package-private) | ✓ | ✓ | ✗ | ✗ | 包內協作類,不想對外公開 |
protected | ✓ | ✓ | ✓ | ✗ | 給子類繼承/覆寫,或包內協作 |
public | ✓ | ✓ | ✓ | ✓ | 對外公共 API、介面 |
核心原則:優先用 private,再考慮 protected/default,最後才 public。違例會導致封裝破壞(如直接 public 欄位)。
Student 類封裝public class Student {
private String name;
private String age;
// 僅內部使用的輔助方法
private String handleName(String name) { return "I'm " + name; }
private String handleAge(String age) { return age + " 歲"; }
// 公共介面
public String getName() { return name; }
public void setName(String name) { this.name = handleName(name); }
public String getAge() { return age; }
public void setAge(String age) { this.age = handleAge(age); }
}
調用端:
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.setName("byhieg");
student.setAge("23");
System.out.println(student.getName() + " " + student.getAge());
// 輸出:I'm byhieg 23 歲
}
}
name/age 為 private,外部不可直接讀寫。handleName/handleAge 為 private,外部不可調用,保證顯示格式只能內部控制。public,提供唯一存取通道,未來需修改格式(如加密、驗證)只需改內部實現,調用端零修改。IllegalArgumentException。封裝是 OOP 基石,透過訪問權限與介面設計,實現「高內聚、低耦合」。良好的封裝讓系統易讀、易維護、易擴展,是從「能跑」邁向「好維護」的關鍵一步。