構造函數
1. 構造函數的的概述
概述
Java 中構的造函數是一種特殊的函數,用來在對象實例化時初始化對象的成員變量及初始化操作。格式
函數名與類名相同且沒有返回值類型。例如:ClassName(){}
注意:
這里僅僅是沒有返回值類型,而不是說構造方法沒有return
調用,后面會用代碼來簡單驗證。
作用
為對象進行初始化操作及賦值。默認構造函數特點:
- 在編譯的時候檢查。
- 如果沒有定義過構造函數,JVM 會為我們創建一個默認的空參數的構造函數。
- 如果在類中定義了指定的構造函數,那么類中的默認構造函數就沒有了??。
2. 與一般函數的區別
- 調用時期
- 構造函數:在創建對象時,會調用與之對應的構造函數,為對象進行初始化。
- 一般函數:對象創建后,對象調用該函數時才會被調用。
- 調用次數
- 構造函數:對象創建時調用,而且只調用一次。
- 一般函數:對象創建后,可以被多次調用。
3. 構造函數的使用
當在描述該對象時,該對象一存在就需要具備的一些內容,這些內容我們定義在構造函數中。
/*
舉例:在一個 Person 類中,定義了成員變量 name,我們為這個類定義構造函數。
*/
class Person {
private String name;
Person() {
this.name = "baby"; // 如果沒有起名字的話,我們就叫他 baby??。
}
Person(String name) {
this.name = name;
}
}
4. 多個構造函數
如上面代碼所示??我們定義了兩個名為 Person 的函數,也就是定義了兩個構造函數。但這兩個函數的參數列表是不同的,所以定義多個構造函數實際上就是 函數重載 的過程。
注意:
構造函數雖然是一個特殊的函數,但是它也具備一般函數的共同特點。
5. 內存的表現形式(內存圖)
構造函數內存圖
6. 對象創建步驟(內存圖)
構造方法內存圖
7. 構造函數賦值和set區別
構造函數(指定默認初始值)只能對在對象加載創建時調用一次,而 set
方法可以調用多次。
8. 默認構造函數的消失
class Person {
private String name;
private int age;
Person(String: name, int age) {
this.name = name;
this.age = age;
}
}
class Person_Sample {
Person person = new Person();
/*
此時沒有無參的構造函數,編譯報錯。
也可以說我們自定義構造函數后,就必須要使用我們定義后的構造函數。
*/
}
9. 構造函數的 reurun 語句
class Person {
Person() {
return ; // 可以編譯通過,說明構造函數有返回值,用來結束函數。
}
}
10. 調用本類構造函數
注意:
this
可以用于在構造函數中調用其他構造函數,但只能放在第一行,因為構造函數的調用是一個初始化的過程,JVM 會進行初始化操作。所以在構造函數之前的語句調用的方法是無效的。
class Person {
private String name;
private int age;
Person(String name) {
this.name = name;
}
Person(int age) {
this.age = age;
}
// 調用本類構造函數
Person(String name, int age) {
this(name);
this(age); // 錯誤: 對this的調用必須是構造器中的第一個語句,否則之前語句被初始化覆蓋。
}
}