在定義類別時,可以使用建構式定義物件建立的初始流程。建構式是與類別名稱同名,無需宣告傳回型態的方法。例如:
public class Some {
private int a = 10; // 指定初始值
private String text; // 預設值null
public Some(int a, String text) {
this.a = a;
this.text = text;
}
...
}
如果你如下建立Some
物件,成員a
與text
會初始兩次:
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
物件時,a
與text
分別先初始為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)
的形式來建構物件。