在 Java 中,建構式是一個類似於方法的程式碼區塊。當類別的實例被創建時,會調用建構式,在調用建構式的時候,物件的記憶體會被分配。
如果在類別中沒有明確定義任何建構式,Java 會自動提供一個預設的無參數建構式。這個建構式會執行基本的初始化操作,如將物件的屬性設為其類型的預設值(例如,整數的預設值是 0,布林值是 false,參考型別則是 null);反之,如果在類別中有定義建構式,Java則不會另外再自動生成建構式。
每次使用 new()
關鍵字建立物件時,都會呼叫建構式。
建構式的規則:
1.建構式名稱必須與其類別名稱相同。
2.建構函數不可宣告回傳值型態。
3.Java 建構子不能是abstract
、static
、final
和 synchronized
例如:
class Animal {
String name;
// 建構式,會在每次創建物件時調用
public Animal(String name) {
this.name = name;
System.out.println(name + " 被創建了!");
}
}
public class Main {
public static void main(String[] args) {
// 第一次實例化
Animal dog = new Animal("狗");
// 第二次實例化
Animal cat = new Animal("貓");
}
}
// output: 狗 被創建了!
// output: 貓 被創建了!
重載(overload)
Java 的建構式跟方法一樣,支持重載(overload),判斷標準是根據參數的數量、類型和順序來區分不同的建構式。因此,兩個建構式如果只有參數名稱不同,而參數數量和類型都相同,Java 會認為它們是相同的建構式,從而導致衝突。
// 以下是錯誤示範
public class Person {
String name;
int age;
// 第一個建構式
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 第二個建構式,參數數量和類型與上面的相同
public Person(String firstName, int years) {
this.name = firstName;
this.age = years;
}
}
上面的範例會報錯error: constructor Person(String,int) is already defined in class Person