構造器是對象初始化的核心機制,決定對象創建時的狀態建立方式。本文詳細講解默認構造器、重載規則、訪問控制、調用鏈等關鍵概念。
| 規則 | 說明 |
|---|---|
| 無構造器時 | 編譯器自動生成 public 無參構造器 |
| 有任意構造器 | 編譯器不再生成默認構造器 |
| 重載區分 | 參數類型、數量、順序不同(與參數名無關) |
| 訪問修飾符 | 可為 public/protected/default/private |
| 無返回類型 | 甚至不能寫 void |
| 名稱與類同 | 大小寫敏感 |
class Class1 {
// 無顯式構造器 → 自動獲得 public Class1() {}
}
class Class2 {
public Class2() {} // 手寫無參構造器
}
class Class3 {
public Class3() {} // 無參
public Class3(String name) {} // 有參
}
class Class4 {
public Class4(String name) {} // 僅有參 → 無無參構造器
// new Class4() 編譯錯誤
}
class Class5 {
public Class5() {}
public Class5(String name) {}
public Class5(int age) {}
public Class5(String name, int age) {}
}
public static void main(String[] args) {
new Class1(); // OK - 默認構造器
new Class2(); // OK - 顯式無參
new Class3(); // OK - 無參
new Class3("java"); // OK - 有參
// new Class4(); // 編譯錯誤 - 無無參構造器
new Class4("java"); // OK
new Class5(); // OK
new Class5("java"); // OK
new Class5(1); // OK
new Class5("java", 1); // OK
}
public Class4(String name) {}
public Class4(String address) {} // 錯誤:簽名相同
class Person {
private String name;
private int age;
public Person() {
this("未知", 0); // 調用另一構造器
}
public Person(String name) {
this(name, 0);
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
this(...) 避免代碼重複,統一初始化邏輯