建構子Constructor

      在〈建構子Constructor〉中尚無留言

建構子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;
    }
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *