構造方法(Constructor) 是在對象創建時(`new ClassName()`)由 JVM 自動調用的特殊方法,用於**初始化對象的實例字段(非靜態字段)**,使對象進入合法、可用的初始狀態。
class User {
String name; // null
int age; // 0
boolean vip; // false
}
// new User() → name=null, age=0, vip=false
class User {
String name;
int age;
public User(String name, int age) {
this.name = name; // 初始化數據
this.age = age;
}
}
// new User("Alice", 25) → name="Alice", age=25
class User {
String name;
int age;
String email;
public User(String name, int age) {
this(name, age, null); // 調用全參構造
}
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
}
class Account {
String id;
BigDecimal balance;
public Account(String id, BigDecimal initialBalance) {
if (initialBalance == null || initialBalance.compareTo(BigDecimal.ZERO) < 0) {
throw new IllegalArgumentException("初始餘額不能為負");
}
this.id = id;
this.balance = initialBalance;
}
}
class Demo {
int a = 10; // ① 聲明賦值
{ a = 20; } // ② 實例初始化塊
int b = a + 5; // ③ 聲明賦值(可用前面字段)
public Demo() { // ④ 構造函數
a = 30;
}
}
// new Demo() → a=30, b=25 (①a=10 → ②a=20 → ③b=25 → ④a=30)
| 誤區 | 正確認知 |
|---|---|
| 構造方法創建對象 | `new` 分配內存並創建對象,構造方法只負責初始化 |
| 構造方法有返回值 | 無返回類型(連 void 都不能寫),隱式返回 this 引用 |
| 不寫構造方法就沒有初始化 | 編譯器自動生成無參無體構造方法,字段取默認值 |
| 構造方法中調用可覆寫方法安全 | 危險:子類覆寫方法可能訪問未初始化的子類字段 |
構造方法是 **「對象出生時的初始化儀式」**。它接收參數,對實例字段進行賦值、驗證、衍生計算,建立對象的**不變量**,確保對象一出生就處於合法、可用狀態。對象的數據 = 實例字段;初始化 = 默認值 → 聲明賦值/初始化塊 → 構造函數體。掌握這條主線,構造方法不再抽象。