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 的錯誤,該錯誤是由於無限迴圈引起的。

更新於: 2023年5月16日

1K+ 瀏覽量

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.