Java 递归构造函数调用

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的错误,这是由于无限循环而引起的。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程