所以让我们说:
public class Sample { //main() class
public static void main(String[] args) {
A a = new A();
}
}
public class A {
A aa = new A();
}
所以...当我运行它时...它给出:java.lang.StackOverflowError。
因此,我的解释是第1行的对象a
生成,进一步在第2行创建对象aa
生成...然后它进入递归....它继续在对象之后创建对象,直到堆内存已满。
如果在Heap上创建对象...那为什么说StackOverflowError ??
答案 0 :(得分:4)
嗯,它同时使用堆和堆栈。堆栈空间是因为您以递归方式在A
的构造函数中。如果将初始化放在构造函数的主体中,那么看起来会更简单:
public class A {
A aa;
public A() {
aa = new A();
}
}
因此A
构造函数调用自身,然后调用自身,等等。通常堆栈空间比堆栈空间更多,因此为什么你首先耗尽堆栈空间。如果你的类有很多字段,你可能会首先耗尽堆空间 - 虽然通常堆在现代机器中非常庞大。
答案 1 :(得分:0)
堆栈溢出的原因很简单,在(小)As可以填满堆之前,堆栈空间不足。
您已正确识别递归。原来如此!