
1. 構(gòu)造函數(shù)的的概述
概述
Java 中構(gòu)的造函數(shù)是一種特殊的函數(shù),用來在對象實(shí)例化時(shí)初始化對象的成員變量及初始化操作。格式
函數(shù)名與類名相同且沒有返回值類型。例如:ClassName(){}
注意:
這里僅僅是沒有返回值類型,而不是說構(gòu)造方法沒有return調(diào)用,后面會(huì)用代碼來簡單驗(yàn)證。
作用
為對象進(jìn)行初始化操作及賦值。默認(rèn)構(gòu)造函數(shù)特點(diǎn):
- 在編譯的時(shí)候檢查。
- 如果沒有定義過構(gòu)造函數(shù),JVM 會(huì)為我們創(chuàng)建一個(gè)默認(rèn)的空參數(shù)的構(gòu)造函數(shù)。
- 如果在類中定義了指定的構(gòu)造函數(shù),那么類中的默認(rèn)構(gòu)造函數(shù)就沒有了??。
2. 與一般函數(shù)的區(qū)別
- 調(diào)用時(shí)期
- 構(gòu)造函數(shù):在創(chuàng)建對象時(shí),會(huì)調(diào)用與之對應(yīng)的構(gòu)造函數(shù),為對象進(jìn)行初始化。
- 一般函數(shù):對象創(chuàng)建后,對象調(diào)用該函數(shù)時(shí)才會(huì)被調(diào)用。
- 調(diào)用次數(shù)
- 構(gòu)造函數(shù):對象創(chuàng)建時(shí)調(diào)用,而且只調(diào)用一次。
- 一般函數(shù):對象創(chuàng)建后,可以被多次調(diào)用。
3. 構(gòu)造函數(shù)的使用
當(dāng)在描述該對象時(shí),該對象一存在就需要具備的一些內(nèi)容,這些內(nèi)容我們定義在構(gòu)造函數(shù)中。
/*
舉例:在一個(gè) Person 類中,定義了成員變量 name,我們?yōu)檫@個(gè)類定義構(gòu)造函數(shù)。
*/
class Person {
private String name;
Person() {
this.name = "baby"; // 如果沒有起名字的話,我們就叫他 baby??。
}
Person(String name) {
this.name = name;
}
}
4. 多個(gè)構(gòu)造函數(shù)
如上面代碼所示??我們定義了兩個(gè)名為 Person 的函數(shù),也就是定義了兩個(gè)構(gòu)造函數(shù)。但這兩個(gè)函數(shù)的參數(shù)列表是不同的,所以定義多個(gè)構(gòu)造函數(shù)實(shí)際上就是 函數(shù)重載 的過程。
注意:
構(gòu)造函數(shù)雖然是一個(gè)特殊的函數(shù),但是它也具備一般函數(shù)的共同特點(diǎn)。
5. 內(nèi)存的表現(xiàn)形式(內(nèi)存圖)

6. 對象創(chuàng)建步驟(內(nèi)存圖)

7. 構(gòu)造函數(shù)賦值和set區(qū)別
構(gòu)造函數(shù)(指定默認(rèn)初始值)只能對在對象加載創(chuàng)建時(shí)調(diào)用一次,而 set 方法可以調(diào)用多次。
8. 默認(rèn)構(gòu)造函數(shù)的消失
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();
/*
此時(shí)沒有無參的構(gòu)造函數(shù),編譯報(bào)錯(cuò)。
也可以說我們自定義構(gòu)造函數(shù)后,就必須要使用我們定義后的構(gòu)造函數(shù)。
*/
}
9. 構(gòu)造函數(shù)的 reurun 語句
class Person {
Person() {
return ; // 可以編譯通過,說明構(gòu)造函數(shù)有返回值,用來結(jié)束函數(shù)。
}
}
10. 調(diào)用本類構(gòu)造函數(shù)
注意:
this可以用于在構(gòu)造函數(shù)中調(diào)用其他構(gòu)造函數(shù),但只能放在第一行,因?yàn)闃?gòu)造函數(shù)的調(diào)用是一個(gè)初始化的過程,JVM 會(huì)進(jìn)行初始化操作。所以在構(gòu)造函數(shù)之前的語句調(diào)用的方法是無效的。
class Person {
private String name;
private int age;
Person(String name) {
this.name = name;
}
Person(int age) {
this.age = age;
}
// 調(diào)用本類構(gòu)造函數(shù)
Person(String name, int age) {
this(name);
this(age); // 錯(cuò)誤: 對this的調(diào)用必須是構(gòu)造器中的第一個(gè)語句,否則之前語句被初始化覆蓋。
}
}