如果超级构造函数中有参数,则 superclass 的内部 class 的构造函数未定义

The constructor of an inner class of a superclass is undefined if there is argument in the super-constructor

我有一个 class AA_subA 的内部 class。

public class A {

    protected class A_sub { 
        int A_sub_x = 1;
        A_sub parent;
    
        A_sub(A_sub obj_A_sub) {
            System.out.println("Constructor A.A_sub");
            parent = obj_A_sub;
        }
    }

    public A() {
        System.out.println("Constructor A");
    }

}

然后我有一个 class Main(它扩展了 A)和一个方法 mainMain 也有一个内部的 class A_sub(扩展 A.A_sub)。但是我在 super() 行收到一条错误消息,说“构造函数 A.A_sub() 未定义”。我该如何解决?

class Main extends A{

    public Main() {
    }

    private class A_sub extends A.A_sub{ 
        int A_sub_z;

        A_sub(A_sub obj_A_sub) {
            super();
            System.out.println("Constructor Main.A_sub");
            A_sub_z = 3;
        }
    }


    public static void main(String args[]) {

        Main obj = new Main();
        A_sub obj_sub = obj.new A_sub(null);

        System.out.println(obj_sub.A_sub_x);
        System.out.println(obj_sub.A_sub_z);

    }
}

实际上没有构造函数,因为 A$A_sub.A_sub() - 您拥有的构造函数带有一个 A_sub 参数。解决这个问题的一种方法是将 Main$A_sub.A_sub 的参数传递给其父级的构造函数:

class Main extends A{

    private class A_sub extends A.A_sub{ 
        int A_sub_z;

        A_sub(A_sub obj_A_sub) {
            super(obj_A_sub);
            // Here-^
            System.out.println("Constructor Main.A_sub");
            A_sub_z = 3;
        }
    }

    // The rest of Main's constructors and methods have been snipped for brevity
}

只需在 class A_sub

中创建一个空构造函数

所以,内classA_sub应该是

protected class A_sub {
        int A_sub_x = 1;
        A_sub parent;

        A_sub(A_sub obj_A_sub) {
            System.out.println("Constructor A.A_sub");
            parent = obj_A_sub;
        }

        public A_sub() {

        }
    }

因为 class Main.A_sub 扩展了 A.A_sub 并且它有非默认构造函数你必须传递所需的参数

    private class A_sub extends A.A_sub {

        A_sub(A_sub obj_A_sub) {
            super(null); // Pass the required argument
            //....
        }
    }