下面是非常简单的程序,它给出了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)
当你执行new Test()
时,Test
的实例字段将被初始化。在这种情况下,将初始化tt
。
那么,你如何初始化tt
?你调用它的构造函数。执行此操作时,需要初始化tt.tt
。这将再次调用构造函数,该构造函数尝试初始化tt.tt.tt
。就这样一直持续下去。
因此,Test
构造函数调用同一个Test
构造函数,从而导致堆栈溢出。情况是这样的:
Test tt;
public Test() {
tt = new Test();
}
实际上,当程序启动时,它会创建一个实例,因为它是在方法外部声明的,所以基本上您可以在主实例下创建并创建另一个实例。
Test tt = new Test();
此代码创建一个递归调用。所以结果是一个StackOverflow。你有它。