如何解析’隐式超级构造函数classA()是不可见的。 必须显式调用另一个构造函数’?

我有一个类’ClassA’,它有私有构造函数。

public final class ClassA{ private ClassA{ } public static void main(String[] arg) }{ ; ; ; } } 

现在,我正在扩展“ClassA”类[在执行此操作之前删除了最终关键字]

 public class ClassB extends ClassA{ public static void main(String[] arg) }{ ; ; ; } } 

现在,我得到Implicit super constructor classA() is not visible. Must explicitly invoke another constructor Implicit super constructor classA() is not visible. Must explicitly invoke another constructor 。 它是什么意思以及如何解决这个问题?

注意我无法更改ClassA构造函数的访问说明符。

将ClassA的构造函数可见性从private更改为protected

构造函数总是从调用超类构造函数开始。 如果构造函数显式包含对超类构造函数的调用,则使用该构造函数。 否则暗示无参数构造函数。 如果无参数构造函数不存在或子类不可见,则会出现编译时错误。

我建议使用组合而不是inheritance(也许这就是ClassA的设计者用于类的用法。示例:

公共类ClassB {
   私人ClassA classA;

    ClassB(){
        // init classA
        ...
    }

    public ClassA asClassA(){
       返回classA;
    }

    // ClassB扩展的其他方法和成员
 }

您可以将方法从ClassB委托给ClassA或覆盖它们。

Java将隐式创建一个没有ClassB参数的构造函数,它将调用super()。 在您的情况下,ClassA中的构造函数不可见,因此您得到的错误。 将可见性更改为public或protected将解决该错误。

private ClassA{}更改为protected ClassA{}听起来像是一个很好的解决方案。

父构造函数总是在子类中调用:隐式或不隐式。 所以,你的ClassB定义相当于

 public ClassB extends ClassA { public ClassB() { super(); } // all other methods you have go here... } 

如果ClassA的唯一构造函数是私有的,则无法从ClassB调用它。