一、構造函數基礎概念
Java構造函數是一種特殊的方法,用於創建並初始化一個對象。當我們創建一個類的實例時,JVM會在內存中分配堆空間來存放對象,並使用構造函數對對象進行初始化。構造函數和普通方法不同在於:
- 構造函數的方法名必須和類名相同
- 構造函數沒有返回值類型,也不能使用void關鍵字
- 每個類都有至少一個構造函數,默認為空參,可以自己手寫或通過反射獲取
- 構造函數只有在實例化對象時被調用,而不能主動調用
下面是一個簡單的構造函數示例:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
上述代碼中,Person類有一個構造函數,它用於初始化name和age兩個成員變量。
二、構造函數的重載
Java允許在同一個類中定義多個構造函數,這稱為構造函數的重載。當我們創建對象時,可以根據需要選擇不同的構造函數。
構造函數的參數列表和類型、個數、順序等必須不同,否則編譯器會報錯。例如,我們可以為Person類添加一個空參構造函數:
public class Person {
private String name;
private int age;
public Person() {
this.name = "Unknown";
this.age = 0;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
上述代碼中,Person類有兩個構造函數:一個空參構造函數和一個雙參構造函數。空參構造函數用於在不知道具體姓名和年齡時創建一個Person對象,雙參構造函數則用於傳入具體的姓名和年齡信息。
三、構造函數的調用順序
當一個對象被創建後,Java會按照特定的順序調用構造函數。這些構造函數調用的順序是:
- 如果存在父類,首先會調用父類的構造函數
- 接着會調用同類中定義的所有實例變量的初始化語句和初始化塊
- 最後調用本類的構造函數
因此,在子類的構造函數中,可以使用super關鍵字調用父類的構造函數,也可以使用this關鍵字調用同類中的其他構造函數。
下面是一個多層繼承的示例:
public class Animal {
public Animal() {
System.out.println("Animal constructor");
}
}
public class Cat extends Animal {
public Cat() {
super();
System.out.println("Cat constructor");
}
}
public class PersianCat extends Cat {
public PersianCat() {
System.out.println("PersianCat constructor");
}
}
當我們創建一個PersianCat對象時,構造函數的調用順序是:Animal() -> Cat() -> PersianCat()。因此,輸出結果應該是:
Animal constructor Cat constructor PersianCat constructor
四、構造函數的作用
Java構造函數通常用於:
- 初始化實例變量
- 確保對象的狀態是合法的
- 調用父類的構造函數,以確保父類的初始化
下面是一個實例變量的初始化示例:
public class Car {
private String brand;
private int price;
public Car(String brand, int price) {
this.brand = brand;
this.price = price;
}
}
上述代碼中,Car類有一個雙參構造函數,用於初始化brand和price兩個成員變量。
下面是一個確保對象狀態合法的示例:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
if (name == null) {
throw new IllegalArgumentException("Name cannot be null");
}
if (age 200) {
throw new IllegalArgumentException("Age should be between 0 and 200");
}
this.name = name;
this.age = age;
}
}
上述代碼中,Person類有一個雙參構造函數,用於確保傳入的名字不為空,年齡值在合法範圍內。
下面是一個調用父類的構造函數的示例:
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
}
public class Cat extends Animal {
private int age;
public Cat(String name, int age) {
super(name);
this.age = age;
}
}
上述代碼中,Cat類有一個雙參構造函數,用於初始化name和age兩個成員變量。這個構造函數調用了父類的構造函數Animal(String name)來初始化name成員變量。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/288567.html
微信掃一掃
支付寶掃一掃