基礎程式設計(15)-建構子

建構子(Constructor)是指和類別(Class)名稱相同的方法。當我們使用new建立新物件時,程式會自動執行建構子,所以它常被用來做物件參數初始化的動作。物件的建構子擁有下面三個特點:

class role    //宣告role類別(物件原型)
{
    private static int baseStrength = 10;
    private int strength = 0;
 
    public role() {         //建構子
        strength = 2;
    }
    public role(int classes) {  //過載的建構子
        switch (classes) {
            case 1:
                strength = 5;
                break;
            case 2:
            case 3:
                strength = 2;
                break;
            case 4:
                strength = 1;
                break;
            default:
        }
    }
    public int getSTR() {
        return baseStrength + strength;
    }
}
 
public class test   //與檔名相同名稱的物件
{
    //main方法是程式的入口,執行程式從這裡開始
    public static void main(String[] args)  //這一行是固定寫法
    {
        role r1 = new role();   //無參數,呼叫role()建構子
        role r2 = new role(1);  //建立物件時傳入參數1
 
        System.out.println("r1 strength = " + r1.getSTR());
        System.out.println("r2 strength = " + r2.getSTR());
    }
}

在上面的程式中,role類別建立了二個建構子,分別在第 6 行和第 9 行。第 6 行的建構子沒有傳入任何參數,而第 9 行的建構子則傳入一個 int 的參數。我們來測式這二個建構子,在 main 方法中建立二個 role 物件,但是 34 行沒有傳入任何參數,而 35 行傳入參數 1。則輸出結果 r1 strength = 12、r2 strength = 15 (在 10-22 行的 switch 中,若傳入的 classes = 1,則 strengthPlus = 5)。

使用this參考物件本身

在Java語言中,類別可以使用「this」這個關鍵字代表物件的本身。常見的用法有二種,第一種是當方法裡的變數和物件屬性(成員變數)名稱一樣的時候,使用 this 來表示物件屬性(以變數範圍的觀念來看就是全域變數)。參考下面的程式碼,第 9 行使用 this.classes 來表示第 5 行的 classes 變數。

class role    //宣告role類別(物件原型)
{
    private static int baseStrength = 10;
    private int strengthPlus = 0;
    public int classes = 0;

    public role() { this(1); /* = role(1); */ }
    public role(int classes) {
        this.classes = classes;

        switch (classes) {
            case 1:
                strengthPlus = 5;
                break;
            case 2:
            case 3:
                strengthPlus = 2;
                break;
            case 4:
                strengthPlus = 1;
                break;
            default:
        }
    }
    public int getSTR() {
        return baseStrength + strengthPlus;
    }
}
 
public class test   //與檔名相同名稱的物件
{
    //main方法是程式的入口,執行程式從這裡開始
    public static void main(String[] args)  //這一行是固定寫法
    {
        role r1 = new role();   //無參數,呼叫role()建構子
        role r2 = new role(2);  //建立物件時傳入參數1

        System.out.println("r1 strength = " + r1.getSTR() + ", classes = " + r1.classes);
        System.out.println("r2 strength = " + r2.getSTR() + ", classes = " + r2.classes);
    }
}

第二種使用方式是呼叫本身的建構子,例如上面第 7 行的程式。如果 this 被用來呼叫建構子的時候,必需要在這個程式區塊裡的第一行,這點要特別注意。當然,如果不用 this 直接打上建構子的名稱(要傳入對應的參數)也是可以的。

第二段程式碼如果沒有傳入 classes 參數,預設值是 1。所以最後的輸出結果為 r1 strength = 15, classes = 1、r2 strength = 12, classes = 2。