一、構造函數基礎概念
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-hant/n/288567.html