昨天我們聊到,寫下 new 就像按下製卡機的開關。今天我們來拆解這整套「身分證壓印出爐」的精準流程:
new 是抽出一張空白卡: 電腦記憶體騰出一塊空位,拿一張全新的空白晶片卡。
建構子把資料烙印上去: 接在後面的 Person("小明", 20),就是把括號裡的申請資料遞給機器。建構子在卡片出爐的瞬間,立刻把小明、20歲寫入卡片內部,這時候卡片就已經是印好資料的完成品了!
等號 = 是把證件塞進套子: 左邊宣告的變數就像透明證件套(容器),透過等號把這張剛印好的實體卡片塞進套子裡,從此你才能拿著這個套子隨時使用它。
如果只有 new Person(...) 而沒有用等號塞進套子,這張剛印好的證件就會直接掉在地上;因為沒有任何容器裝著它,轉眼間就會被清潔工(Garbage Collector)掃進垃圾桶回收!
1.建構子的兩大鐵則:同名、沒有回傳值,Java 替建構子立下了兩道非常嚴格的規定:
1.名稱必須跟類別(Class)一模一樣: 連大小寫都不能差半點(類別叫 Person,建構子就必須叫 Person)。
2.完全沒有回傳型別: 它只負責誕生與烙印,不能宣告回傳任何東西(連 void 都不能寫)。
public class Person {
String name;
int age;
// 這就是建構子!名字跟 Class 完全相同,且沒有 void
public Person(String newName, int newAge) {
name = newName; // 把櫃台收到的資料,烙印進這張身分證的欄位裡
age = newAge;
}
}
當你在主程式寫下 new Person("王小明", 20) 時,Java 就會直接把王小明與20永久寫進這張新卡片裡,卡片一出爐就會填好個人檔案。
2.神秘的保底機制:你不寫,Java 送你,你寫了,Java 收回
很多人會問:「我明明沒寫建構子,為什麼也能 new Person() 成功?」 這是 Java 內建的貼心保底機制:
如果你懶到一行建構子都沒寫,Java 會像佛心櫃台一樣在背後偷偷塞給你一個空的無參數建構子
public Person() {},讓你可以直接領走一張空白卡。 收回機制:只要你自己動手寫了一個帶參數的建構子(例如規定辦卡一定要填名字、年齡),Java 就會認定:「哦?你自己訂規矩了是吧!看來你想搞實名制、嚴格把關,不准任何人打混領空白卡了!」 於是它會瞬間把原本免費贈送的「白卡通道」無情封死。這時候,物件必須與生俱來就自帶資料。外面想要辦卡的人必須指名道姓把姓名年齡等資料交出來,才能完成辦理;要是誰還敢兩手空空寫 new Person() 企圖混過去,Java 櫃台就會當場亮紅字報警:「資料沒給齊,門都沒有,不准出生!」
3. 解決撞名危機:this 就是物件本人
在寫建構子時,為了直覺好懂,我們通常會把傳進來的資料欄位,取跟卡片上一模一樣的名字(例如都叫 name):
public Person(String name) {
name = name; // 電腦問號:你是在跟自己玩迴力鏢嗎?
}
這時就要拿出救星關鍵字 this=物件=這張卡片
this.name = name; // 這張卡片的name = 括號傳進來的值
一句話刻進腦袋裡:this.物件的格子 = 括號遞進來的資料;有了 this,電腦不用猜到底誰是誰,秒解決撞名慘案!
4. 給我名字就好,剩下的用 this(...) 自動腦補
如果有客人臨櫃辦卡超懶,只肯給名字、死都不報年齡,櫃台為了讓卡片順利印出來,可以幫忙補上預設 18 歲,然後整份轉發給對應窗口處理:
1.客人只給名字: 寫下 new Person("小明"),進到「只收名字」的建構子。
public Person(String name) {
this(name, 18); 2.程式按順序跑下來先撞見 this(name, 18);
}
3.發現括號裡是一個字串+一個整數 (String, int),立刻對應到下方的建構子。
public Person(String name, int age) {
this.name = name;
this.age = age;
}4.小明 和 18 被傳進建構子,執行 this.name = name; this.age = age; 烙印進卡片,完成製卡