是一个非常简单的程序,它给出stackOverFlow错误。这与流程混淆。有人可以告诉我该程序的确切流程,并告诉我相应错误的原因。
package test;
class Test{
Test tt = new Test();
public static void main(String[] args) {
new Test();
}
}
输出-
Exception in thread "main" java.lang.StackOverflowError
at test.Test.<init>(Test.java:4)
at test.Test.<init>(Test.java:4)
at test.Test.<init>(Test.java:4)
at test.Test.<init>(Test.java:4)
at test.Test.<init>(Test.java:4)
at test.Test.<init>(Test.java:4)
答案 0 :(得分:2)
执行new Test()
时,Test
的实例字段将被初始化。在这种情况下,tt
将被初始化。
那么,您如何初始化tt
?您将其称为构造函数。这样做时,tt.tt
将需要初始化。这将再次调用构造函数,该构造函数尝试初始化tt.tt.tt
。它如此持续下去。
因此Test
构造函数正在调用相同的Test
构造函数,从而导致堆栈溢出。情况有点像这样:
Test tt;
public Test() {
tt = new Test();
}
答案 1 :(得分:0)
实际上,程序启动时会创建一个实例,因为它是在方法外部声明的,因此基本上您可以在主实例下创建,创建和创建另一个实例。
Test tt = new Test();
此代码创建一个递归调用。因此,结果是一个StackOverflow。就在那里。