Java 中的递归构造函数调用
javaobject oriented programmingprogramming更新于 2024/8/17 1:57:00
递归构造函数调用是构造函数调用自身时发生的编译时错误。它类似于递归,其中方法根据需要多次调用自身。调用自身的方法称为递归方法,调用自身的构造函数称为递归构造函数。
在本文中,我们将通过几个示例了解 Java 中的递归构造函数调用错误。
递归构造函数调用
构造函数
它与方法非常相似,但不同之处在于方法定义对象的行为,而构造函数用于初始化这些对象。我们可以为方法提供我们选择的任何名称,但构造函数必须与类名同名。此外,方法可以返回一个值,但构造函数不返回任何值,因为它们不能有任何返回类型。
当用户没有创建任何构造函数时,Java 编译器将自动创建一个(我们称之为默认构造函数)。
示例 1
public class Cnst { // 类名 Cnst() { // 构造函数 System.out.println("I am construction"); } public static void main(String[] args) { Cnst obj = new Cnst(); // 调用构造函数 } }
输出
I am construction
尽管构造函数和方法有相似之处,但 Java 不允许递归构造函数。这是一种不好的编程习惯。
示例 2
以下示例说明了递归构造函数调用错误。
在这里,我们将创建一个类并定义其构造函数以及两个参数。然后,我们将在其主体中调用相同的构造函数。
public class Cart { String item; double price; Cart(String item, int price) { // 构造函数 this(item, price); // 构造函数调用自身 // this 关键字表明这些变量属于构造函数 this.item = item; this.price = price; } public static void main(String[] args) { Cart obj = new Cart("Bread", 15); // 创建对象 System.out.println("Constructor calling another Constructor"); } }
输出
Cart.java:4: error: recursive constructor invocation Cart(String item, int price) { // 构造函数 ^ 1 error
示例 3
在下面的例子中,我们将尝试在构造函数内定义一个对象,以检查 Java 是否允许在构造函数内创建对象。
public class Cart { String item; double price; Cart(String item, int price) { // 构造函数 // this 关键字表明这些变量属于构造函数 this.item = item; this.price = price; Cart obj2 = new Cart("Milk", 55); // 创建对象 } public static void main(String[] args) { Cart obj1 = new Cart("Bread", 15); // 创建另一个对象 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 关键字表明这些变量属于构造函数 this.item = item; this.price = price; } public Cart (int price) { // second constructor this(null, price); // 调用第一个构造函数 } public static void main(String[] args) { Cart obj = new Cart(15); // 创建对象 System.out.println("Constructor calling another Constructor"); } }
输出
Constructor calling another Constructor
结论
Java 不允许构造函数递归,因此显然要避免这种编程实践。在本文中,我们首先讨论了构造函数,然后尝试解释递归构造函数。此外,我们还发现了另一个由于无限循环而发生的错误,名为 StackOverflowError。