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

Java 为什么这个对象会导致堆栈溢出?,java,stack-overflow,Java,Stack Overflow,我不太清楚这为什么会导致堆栈溢出。我知道如果在没有实例的情况下调用someMethod方法,它可以正常工作,但我想知道为什么。 谢谢 testitem2=新测试() 这是类test中的一个实例变量。当您创建一个test的实例时,它将创建一个test的新实例并分配给item2。但是test必须进行test并将其分配给它的item2等等。。。您得到无限递归,因此任何堆栈都会很快出现堆栈溢出每个新的test()正在创建另一个test item2=new test();进入无限循环,因为每当初始化tes

我不太清楚这为什么会导致堆栈溢出。我知道如果在没有实例的情况下调用someMethod方法,它可以正常工作,但我想知道为什么。 谢谢


testitem2=新测试()


这是类
test
中的一个实例变量。当您创建一个
test
的实例时,它将创建一个
test
的新实例并分配给
item2
。但是
test
必须进行
test
并将其分配给它的
item2
等等。。。您得到无限递归,因此任何堆栈都会很快出现堆栈溢出

每个新的test()正在创建另一个test item2=new test();进入无限循环

,因为每当初始化
test
类的新实例时,声明的
testitem2=newtest()尝试创建另一个实例,这将再次导致创建另一个实例,并连续调用构造函数。JAVA使用堆栈保存局部变量和部分结果,这在方法调用和返回中起到了作用。因此堆栈最终会溢出。

您已经定义了类测试,这样类测试的每个实例都包含一个新的类测试实例。这是无限递归的经典案例,因此是一条通向堆栈溢出的快速路径。

将问题分解为更小的单元,以便更好地理解, 下面的几行足以让您获得StackOverflow

class test {
    test item2 = new test();   //LINE 1

    public static void main(String[] args) {
        test item = new test();  //LINE 2
    }
}

第2行是入口点,当它执行第2行的“new test()”时,它将尝试创建一个类型test的对象,该对象有一个名为“item2”的变量(来自第1行),但要初始化引用item2,它必须创建一个类型test的新对象,这是一个重复的过程

堆栈溢出错误会导致堆栈上的post溢出,这似乎很合乎逻辑。@skuntsel在这种情况下很容易找到正确的SE进行post!
class test {
    test item2 = new test();   //LINE 1

    public static void main(String[] args) {
        test item = new test();  //LINE 2
    }
}