为什么这个对象导致堆栈溢出?

时间:2013-11-29 18:43:26

标签: java stack-overflow

我不确定为什么会导致堆栈溢出。我知道如果我在没有实例的情况下调用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");
}

}

5 个答案:

答案 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的新对象,是重复的过程。