public class TestClass {
TestClass classIn = new TestClass();
public static void main(String[] args) {
TestClass classIn = new TestClass();
}
}
有谁能告诉我为什么这会导致堆栈溢出?
答案 0 :(得分:2)
错误是因为无论何时尝试创建TestClass
的实例,它都会再次尝试在该行中创建自己的实例 -
TestClass classIn = new TestClass();
这会以递归方式继续,直到堆栈溢出。删除这一行,它应该没问题。
答案 1 :(得分:1)
每次创建classIn
的实例时,都会初始化TestClass
实例变量。因此,每次创建TestClass
的实例时,都会立即创建另一个实例,从而导致无限递归。
第一个实例是在main方法中创建的:
TestClass classIn = new TestClass();
在执行TestClass
的构造函数之前,初始化实例变量(在您的情况下为classIn
),因此创建另一个实例,触发另一个实例的创建,依此类推。 (直到堆栈溢出)。
答案 2 :(得分:1)
正如人们所提到的,你处于无限递归状态,计算机在堆栈溢出之前只能做很多事情。处理递归时,一个非常重要的规则是:总是,总是有一个基类!
考虑阶乘递归示例:
int factorial(int n)
{
if(n = 0)
return 1;
else
return n * factorial(n-1);
}
请注意人类可以手动计算的基本情况。这种情况是防止溢出的情况,因为没有你的代码只会保持循环自身。假设我有3个没有那个基本情况。所以你会得到3 * 2 * 1 * 0 * -1 * -2 ....