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
?这里有递归调用吗?它是如何发生的?
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
做的,构造一个新对象。
这里有递归调用吗?
是的
它是怎么发生的?
当 you 时new A()
,它调用构造函数 for A
,执行 anew A()
调用构造函数,执行 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
拥有一个整数值,仅此而已。在这种情况下,您的构造函数应如下所示:
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);
}
}
}
问题是当你调用构造函数时,你创建了一个新对象(这意味着你再次调用构造函数,所以你创建了另一个对象,所以你再次调用构造函数......)
它是最好的无限递归,它与它是构造函数无关(实际上你可以从构造函数创建新对象)。
基本上,您的构造函数都不会退出 - 每个构造函数都会尝试A
递归地实例化另一个类型的对象。