建構子Constructors
當物件被new 出時, 會自動執行的方法. 故習慣性會把物件內需要初始化的變數放在建構子中執行.
建構子其實就是一個特殊的方法, 但名稱必需與類別名一模一樣, 而且沒有返回值, 甚至連void都沒有, 可以重載.
[modifiers] class ClassName{ [modifiers] ClassName([arguments]){ } }
class Pokemon{ private int level; private float weight; public Pokemon(){ weight=10; level=10; }
為什麼不可以有返回值呢? 仔細思考下面的代碼
Pokemon p1=new Pokemon();
右邊的Pokemon(), 就是去執行建構子這個方法. “=” 是指定運算子, 意思是右邊的值放到左邊的p1. 而右邊的值是什麼? 就是這個物件的雜湊碼(hashcode). 這個雜湊碼是由系統產生, 並由系統傳回. 所以此時如果建構子又有傳回值, 就會跟雜湊碼相衝. 因此才會規定建構子不淮有傳回值, 連 void也不可以有.
預設建構子
以前在還不知道建構子這件事時, 我們並沒有撰寫建構子, 但卻依然可以產生物件. 這是因為類別若無任何建構子時, 編譯器會自動加入預設建構子. 因此就算不寫預設建構子, 一樣可以new 物件.
但若有自訂建構子時, 則編譯器就不會幫我們填入預設建構子了
public Shirt(){} //預設建構子 public Shirt(char colorCode){setColorCode(colorCode);} public Shirt(char colorCode, double price){ this(colorCode); setPrice(price); }
建構子重載
若有加入參數的建構子, 稱為自訂建構子. 預設建構子與自訂建構子可以同時存在, 這是方法重寫(Overload)的機制.
如下的代碼, 表示可以直接將level放入建構子, 如 new Pokemon(10). 但也可以使用 new Pokemon(), 此時表示如果不傳入level, 則執行 this(1), 調用自訂建構子, level使用預設為 1的值.
class Pokemon{ private int level; public Pokemon(){ this(1); } public Pokemon(int level){ this.level=level; } }