编译时错误 - 堆栈溢出,同时创建新的类实例



下面是非常简单的程序,它给出了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。你有它。

最新更新