我不确定为什么会导致堆栈溢出。我知道如果我在没有实例的情况下调用someMethod方法它可以正常工作,但我想知道原因。 感谢
class test {
public static void main(String[] args) {
test item = new test();
item.someOtherMethod();
}
test item2 = new test();
void someOtherMethod() {
item2.someMethod();
}
void someMethod() {
System.out.println("print this");
}
}
答案 0 :(得分:5)
test item2 = new test();
这是您的班级test
中的实例变量。当您创建test
的实例时,它会生成test
的新实例并分配给item2
。但是test
必须创建一个test
并将其分配给它item2
等等......你得到无限递归,所以你很快就会得到任何堆栈的堆栈溢出< / p>
答案 1 :(得分:2)
每个新的test()创建另一个测试item2 = new test();进入一个无限循环
答案 2 :(得分:1)
因为每当新实例初始化您的test
类时,类上下文中声明的test item2 = new test();
会尝试创建另一个实例,这将再次导致创建另一个连续调用构造函数的实例。 JAVA使用堆栈来保存局部变量和部分结果,这些结果在方法调用和返回中起作用。因此堆栈最终会溢出。
答案 3 :(得分:1)
您已经定义了类测试,以便类test的每个实例都包含类test的新实例。这是无限递归的经典案例,因此是堆栈溢出的快速路径。
答案 4 :(得分:1)
将您的问题分解为更小的单元以便更好地理解, 下面的行足以为您提供StackOverflow。
class test {
test item2 = new test(); //LINE 1
public static void main(String[] args) {
test item = new test(); //LINE 2
}
}
第2行是入口点,一旦执行&#34; new test()&#34;在第2行中,它将尝试创建一个类型为test的对象,其中一个变量名为&#34; item2&#34;(来自第1行)但是为了初始化一个引用item2,它必须创建一个类型为test的新对象,是重复的过程。