關於建構式


在定義類別時,可以使用建構式定義物件建立的初始流程。建構式是與類別名稱同名,無需宣告傳回型態的方法。例如:

public class Some {
    private int a = 10;    // 指定初始值
    private String text;   // 預設值null
    public Some(int a, String text) {
        this.a = a;
        this.text = text;
    }
    ...
}

如果你如下建立Some物件,成員atext會初始兩次:

Some some = new Some(10, "some text");

建構物件時,資料成員就會初始化,如果沒有指定初始值,則會使用預設值初始化。預設值如下表所示:

資料型態 初始值
byte 0
short 0
int 0
long 0L
float 0.0F
double 0.0D
char \u0000
boolean false
類別 null

所以使用new建構Some物件時,atext分別先初始為0與null,之後會再經由建構式流程,設定為建構式參數的值。如果定義類別時,沒有撰寫任何建構式,編譯器會自動加入一個無參數、內容為空的建構式。例如若如下撰寫:

public class Some {
}

將這個類別編譯後的位元碼反組譯,你會看到:

public class Some {
    public Some() {
    }
}

正因為編譯器會在你沒有撰寫任何建構式時,自動加入預設建構式(Default constructor),所以才可以在沒有撰寫任何建構式時,也可以如下以無引數方式呼叫建構式:

Some some = new Some();

只有編譯器自動加入的建構式,才稱為預設建構式,如果你自行撰寫無參數、沒有內容的建構式,就不稱為預設建構式了,雖然只是名詞定義,不過認證考試時要區別一下兩者的不同。

如果自行撰寫了建構式,編譯器就不會自動建立預設建構式。如果你這麼寫:

public class Some {
    public Some(int a) {
    }
}

那就只有一個具int參數的建構式,所以就不可以new Some()來建構物件,而必須使用new Some(1)的形式來建構物件。