Java 中的遞迴建構函式呼叫
遞迴建構函式呼叫是一個編譯時錯誤,當建構函式呼叫自身時發生。它類似於遞迴,其中方法根據需要呼叫自身。呼叫自身的函式稱為遞迴函式,呼叫自身的建構函式稱為遞迴建構函式。
在本文中,我們將通過幾個示例瞭解 Java 中的遞迴建構函式呼叫錯誤。
遞迴建構函式呼叫
建構函式
它與方法非常相似,但區別在於方法定義了物件的行為,而建構函式用於初始化這些物件。我們可以為方法提供任何我們選擇的名稱,但建構函式必須與類名相同。此外,方法可以返回值,但建構函式不返回值,因為它們不能有任何返回型別。
當用戶沒有建立任何建構函式時,Java 編譯器會自動建立一個(我們稱之為預設建構函式)。
示例 1
public class Cnst { // class name
Cnst() {
// constructor
System.out.println("I am constructor");
}
public static void main(String[] args) {
Cnst obj = new Cnst();
// calling the Constructor
}
}
輸出
I am constructor
儘管建構函式和方法之間存在相似之處,但 Java 不允許遞迴建構函式。這是一種不好的程式設計實踐。
示例 2
以下示例說明了遞迴建構函式呼叫錯誤。
在這裡,我們將建立一個類並定義其建構函式以及兩個引數。然後,我們將在其主體中呼叫相同的建構函式。
public class Cart {
String item;
double price;
Cart(String item, int price) { // constructor
this(item, price); // constructor is calling itself
// this keyword shows these variables belong to constructor
this.item = item;
this.price = price;
}
public static void main(String[] args) {
Cart obj = new Cart("Bread", 15); // creating object
System.out.println("Constructor calling another Constructor");
}
}
輸出
Cart.java:4: error: recursive constructor invocation
Cart(String item, int price) { // constructor
^
1 error
示例 3
在以下示例中,我們將嘗試在建構函式內部定義一個物件,以檢查 Java 是否允許在建構函式內部建立物件。
public class Cart {
String item;
double price;
Cart(String item, int price) {
// constructor
// this keyword shows these variables belong to constructor
this.item = item;
this.price = price;
Cart obj2 = new Cart("Milk", 55);
// creating object
}
public static void main(String[] args) {
Cart obj1 = new Cart("Bread", 15);
// creating another object
System.out.println("Constructor calling another Constructor");
}
}
輸出
Exception in thread "main" java.lang.StackOverflowError at Cart.<init>(Cart.java:9) at Cart.<init>(Cart.java:9) at Cart.<init>(Cart.java:9) at Cart.<init>(Cart.java:9) at Cart.<init>(Cart.java:9) at Cart.<init>(Cart.java:9) at Cart.<init>(Cart.java:9)
我們得到 StackOverflowError,因為在建構函式內部建立物件會導致物件建立的無限迴圈。
示例 4
以下示例演示了在另一個建構函式內部呼叫建構函式是合法的。
public class Cart {
// class
String item;
double price;
Cart(String item, int price) {
// first constructor
// this keyword shows these variables belong to constructor
this.item = item;
this.price = price;
}
public Cart (int price) {
// second constructor
this(null, price);
// calling the 1st constructor
}
public static void main(String[] args) {
Cart obj = new Cart(15);
// creating object
System.out.println("Constructor calling another Constructor");
}
}
輸出
Constructor calling another Constructor
結論
Java 不允許建構函式的遞迴,因此避免這種程式設計實踐是顯而易見的。在本文中,我們首先討論了建構函式,並試圖解釋遞迴建構函式。此外,我們還發現了另一個名為 StackOverflowError 的錯誤,該錯誤是由於無限迴圈引起的。
廣告
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP