Java 中的建構函式
Java 中的建構函式是什麼?
建構函式 - Constructor 是一種特殊方法,用於初始化新建立的物件,並在為物件分配記憶體後立即呼叫。它可用於在建立物件時將物件初始化為所需的值或預設值。使用者可以不必為類編寫建構函式。
如果沒有為類提供使用者定義的建構函式,則編譯器會將成員變數初始化為其預設值。
- 數字資料型別設定為
0
- char 資料型別設定為空字元(
\0
) - 引用變數設定為
null
在本教程中,你將學習 -
- 什麼是 Java 中的建構函式?
- 建立建構函式的規則
- 建構函式過載
- 構造連結
建立 Java 建構函式的規則
- 它與類同名
- 它不應該返回一個值甚至是
void
示例 1:建立你的第一個 Java 建構函式
步驟 1: 在編輯器中輸入以下程式碼。
class Demo{
int value1;
int value2;
Demo(){
value1 = 10;
value2 = 20;
System.out.println("Inside Constructor");
}
public void display(){
System.out.println("Value1 === "+value1);
System.out.println("Value2 === "+value2);
}
public static void main(String args[]){
Demo d1 = new Demo();
d1.display();
}
}
步驟 2: 儲存、執行和編譯程式碼。觀察輸出。
輸出:
Inside Constructor
Value1 === 10
Value2 === 20
建構函式過載
建構函式過載是 Java 中的一種技術,其中一個類可以包含任意數量的引數列表中不同的建構函式。編譯器通過參考列表中的引數數量及其型別來區分這些建構函式。
Account
類的有效建構函式的示例是
Account(int a);
Account (int a,int b);
Account (String a,int b);
示例 2:瞭解建構函式過載
步驟 1: 在編輯器中輸入下面的程式碼。
class Demo{
int value1;
int value2;
/*Demo(){
value1 = 10;
value2 = 20;
System.out.println("Inside 1st Constructor");
}*/
Demo(int a){
value1 = a;
System.out.println("Inside 2nd Constructor");
}
Demo(int a,int b){
value1 = a;
value2 = b;
System.out.println("Inside 3rd Constructor");
}
public void display(){
System.out.println("Value1 === "+value1);
System.out.println("Value2 === "+value2);
}
public static void main(String args[]){
Demo d1 = new Demo();
Demo d2 = new Demo(30);
Demo d3 = new Demo(30,40);
d1.display();
d2.display();
d3.display();
}
}
步驟 2: 儲存、編譯和執行程式碼。
步驟 3: 錯誤出現後,在繼續下一步之前嘗試並除錯錯誤。
步驟 4: 每個類都有一個預設的建構函式。Demo
類的預設建構函式是 Demo()
。如果你不提供此建構函式,編譯器會為你建立它並將變數初始化為預設值。你可以選擇覆蓋此預設建構函式並將變數初始化為所需的值,如示例 1 所示。
但是如果你指定一個像 Demo(int a)
這樣的引數化建構函式,並且想要使用預設建構函式 Demo()
,那麼你必須指定它。換句話說,如果你的建構函式被覆蓋,並且你想使用預設建構函式,則需要指定它。
步驟 5: 取消註釋行#4-8。儲存、編譯和執行程式碼。
建構函式鏈
想一下一個子類由子類擴充套件的場景。每當建立子類的物件時,首先呼叫父類的建構函式。這稱為** Constructor chaining - 建構函式鏈**。
**示例 3:**瞭解建構函式鏈
步驟 1: 將以下程式碼複製到編輯器中。
class Demo{
int value1;
int value2;
Demo(){
value1 = 1;
value2 = 2;
System.out.println("Inside 1st Parent Constructor");
}
Demo(int a){
value1 = a;
System.out.println("Inside 2nd Parent Constructor");
}
public void display(){
System.out.println("Value1 === "+value1);
System.out.println("Value2 === "+value2);
}
public static void main(String args[]){
DemoChild d1 = new DemoChild();
d1.display();
}
}
class DemoChild extends Demo{
int value3;
int value4;
DemoChild(){
//super(5);
value3 = 3;
value4 = 4;
System.out.println("Inside the Constructor of Child");
}
public void display(){
System.out.println("Value1 === "+value1);
System.out.println("Value2 === "+value2);
System.out.println("Value1 === "+value3);
System.out.println("Value2 === "+value4);
}
}
步驟 2: 執行程式碼。由於建構函式連結,當建立子類 DemoChild
的物件時,首先呼叫父類的建構函式 Demo()
,然後建立子類的建構函式 DemoChild()
。預期輸出為
Inside 1st Parent Constructor
Inside the Constructor of Child
Value1 === 1
Value2 === 2
Value1 === 3
Value2 === 4
步驟 3: 你可能會觀察到父類 Demo
的建構函式被覆蓋。如果要在建立子物件時呼叫重寫的建構函式 Demo(int a)
而不是預設建構函式 Demo()
,該怎麼辦?
在這種情況下,你可以使用關鍵字** super
**來呼叫父類的重寫建構函式。
語法:
super();
// or
super(parameter list);
**示例:**如果你的建構函式類似於 Demo(String Name,int a)
,你將指定 super("Java",5)
,如果使用,則為關鍵字 supe
r 需要是子類的建構函式中的第一行程式碼。
步驟 4: 取消註釋 Line #26 並執行程式碼。觀察輸出。
輸出:
Inside 2nd Parent Constructor
Inside the Constructor of Child
Value1 === 5
Value2 === 0
Value1 === 3
Value2 === 4