Java 编译时错误-创建新类实例时发生stackOverflow

Java 编译时错误-创建新类实例时发生stackOverflow,java,Java,下面是给出stackOverFlow错误的非常简单的程序。这里是流的混淆。有人能告诉我这个程序的确切流程,并告诉我相应错误的原因吗 package test; class Test{ Test tt = new Test(); public static void main(String[] args) { new Test(); } } 输出- Exception in thread "main" java.lang.StackOverflowE

下面是给出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)
线程“main”java.lang.StackOverflower中出现异常 test.test.(test.java:4) test.test.(test.java:4) test.test.(test.java:4) test.test.(test.java:4) test.test.(test.java:4) test.test.(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();

这段代码创建一个递归调用。因此,结果是堆栈溢出。你在问什么是堆栈溢出吗?我知道堆栈溢出错误,但在这个程序中,当没有任何递归时,为什么我会得到它call@RishiKantMalviya创建一个测试实例将创建一个测试实例,该实例将创建一个测试实例,它创建了一个Test的实例…@RishiKantMalviya我们无法运行您的代码,它无法编译。您忘记了关闭构造函数的}。也就是说,每个新的测试实例都会创建一个新的测试实例,它会创建一个新的测试实例。。。好吧,你明白了,“有点像”就是这样。实例初始值设定项被插入到所有不调用
this(…)
的构造函数中,在
super(…)
调用之后,在ctor主体的其余部分之前。