Java 无法调用任何构造函数?

Java 无法调用任何构造函数?,java,constructor,Java,Constructor,在这里,我想理解为什么这个语句test2test2=newtest2()无法调用类Test2的构造函数,类似地Test3 Test=newtest3()无法调用类Test3的构造函数 在这里我想了解这种行为的原因 预期输出:Main Inside Test2 Inside Test3 当前输出:Main有此错误 public class Test { public static void main(String args[]){ System.out.println("

在这里,我想理解为什么这个语句
test2test2=newtest2()Test
的main方法中的code>无法调用类
Test2
的构造函数,类似地
Test3 Test=newtest3()Test2
中的code>无法调用类
Test3
的构造函数

在这里我想了解这种行为的原因

预期输出:
Main Inside Test2 Inside Test3

当前输出:
Main
有此错误

public class Test {

    public static void main(String args[]){
        System.out.println("Main");
        Test2 test2 = new Test2();
    }

}

class Test2 {

     Test2() {
         System.out.println("Inside Test2");
         //do something 
     }
     Test3 test = new Test3();

}

class Test3 {

     Test3() {
         System.out.println("Inside Test3");
         //do something  
     }
     Test2 test2 = new Test2();
}
线程“main”java.lang.StackOverflower中出现异常 在com.practice.stackoverflow.Test3.(Test.java:26) 位于com.practice.stackoverflow.Test2(Test.java:17) 在com.practice.stackoverflow.Test3.(Test.java:26)
Test2
创建一个新的
Test3
对象。。。这将生成一个新的
Test2
对象。。。等等

您试图创建无限多的对象,因此自然会得到StackOverflower错误

以下将起作用:

Exception in thread "main" java.lang.StackOverflowError
    at com.practice.stackoverflow.Test3.<init>(Test.java:26)
    at com.practice.stackoverflow.Test2.<init>(Test.java:17)
    at com.practice.stackoverflow.Test3.<init>(Test.java:26)

Test2
中,您创建了一个
Test3
,它创建了一个
Test2
它创建了一个
Test3
它创建了…请参见页面。“无法调用…”不是诊断性的(而且是不正确的)。如果您遇到错误,请将错误包含在帖子中——没有人应该问。请您详细说明递归是如何在我的代码中发生的,我只是想通过Java JVM了解上面这种情况下的程序执行流程。请注意,您希望打印这些错误的顺序实际上是相反的。@MOnkey Step遍历您的代码,在你的脑子里或者用调试器
Test2
有一个成员变量,它是
Test3
Test3
有一个成员变量,它是
Test2
。当您实例化一个
Test2
时,它将
test3
初始化为一个新的
test3
。当实例化
Test3
时,它将
test2
初始化为新的
test2
。实例化过程不会改变,直到空间用完为止。@sleepToken,如果我的理解有误,请纠正我,所以类的实例变量总是在JVM加载构造函数之前先加载?@MOnkey See。如果您搜索类似“java类实例化执行顺序”或类似的内容,您会发现比这更容易阅读,但这就是源代码。
public class Test {

    public static void main(String args[]){
        System.out.println("Main");
        Test2 test2 = new Test2();
    }

}

class Test2 {

     Test2() {
         System.out.println("Inside Test2");
         //do something 
     }
     Test3 test = new Test3();

}

class Test3 {

     Test3() {
         System.out.println("Inside Test3");
         //do something  
     }
     Test4 test4 = new Test4();
}

class Test4 {
    Test4() {
        System.out.println("Inside Test4");
    }
}