为什么不能在构造函数中实例化该类的相同对象?
public class Run{ public static void main(String... args){ A a1 = new A(); } } class A{ public A(){ A a = new A(); } //here as well A a = new A(); }
为什么这会给出java.lang.StackOverflowError
? 在这里发生递归呼叫吗? 怎么会发生?
你正在构造函数中调用构造函数 – 这就是new
所做的,构造一个新对象。
在这里发生递归呼叫吗?
对
怎么回事?
当你new A()
,它调用A
的构造函数,它执行一个new A()
,它调用构造函数,它执行一个new A()
…等等。 这是递归。
你可以调用,但它将是一个无限运行的递归调用。 这就是你得到StackOverflowError
的原因。
以下将完美地工作:
public class Run{ static int x = 1; public static void main(String... args){ A a1 = new A(); } } class A{ public A(){ if(x==1){ A a = new A(); x++; } } }
问题是当你调用构造函数时,你创建了一个新对象(这意味着你再次调用构造函数,所以你创建了另一个对象,所以你再次调用构造函数……)
它是最好的无限递归,它与构造函数无关(实际上你可以从构造函数中创建新对象)。
基本上你的构造函数都不会退出 – 每个都会尝试递归地实例化另一个类型为A
对象。
您需要更改构造函数以实际创建A
对象。 假设A
保持整数值,仅此而已。 在这种情况下,您的构造函数应如下所示:
class A{ int number; public A(){ number = 0; } }
您在代码中所做的实际上是在您自己的构造函数中创建一个新的对象实例。
因此,当你调用new A()
,你正在调用构造函数,然后在其体内调用new A()
。 它最终无限地调用自己,这就是你的堆栈溢出的原因。
我认为那里有一个递归的召唤。 要创建A,您必须在其中创建另一个A. 但要在其中创建A,你必须在A内部创建第三个A.依此类推。 如果你使用两个不同的构造函数或参数或者某些东西,你应该能够解决这个问题:
class A { public A(boolean spawn){ if (spawn) { A a = new A(false); } } }