如何解析’隐式超级构造函数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
调用它。