编译时错误-stackOverflow,同时创建新的类实例

时间:2019-06-11 05:55:37

标签: java

下面的

是一个非常简单的程序,它给出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)

2 个答案:

答案 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。就在那里。