我正在使用具有私有构造函数的类'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
。它是什么意思以及如何解决这个问题?
注意我无法更改ClassA构造函数的访问说明符。
答案 0 :(得分:7)
将ClassA的构造函数可见性从private
更改为protected
。
构造函数总是从调用超类构造函数开始。如果构造函数显式包含对超类构造函数的调用,则使用该构造函数。否则暗示无参数构造函数。如果无参数构造函数不存在或子类不可见,则会出现编译时错误。
答案 1 :(得分:7)
我建议使用合成而不是继承(也许这就是ClassA
的设计者用于课程用法的内容。例如:
public class ClassB { private ClassA classA; ClassB() { // init classA ... } public ClassA asClassA() { return classA; } // other methods and members for ClassB extension }
您可以将方法从ClassB
委托给ClassA
或覆盖它们。
答案 2 :(得分:3)
Java将隐式创建一个没有ClassB参数的构造函数,它将调用super()。在你的情况下,ClassA中的构造函数是不可见的,因此你得到的错误。将可见性更改为public或protected将解决错误。
答案 3 :(得分:2)
将private ClassA{}
更改为protected ClassA{}
听起来像是一个很好的解决方案。
父构造函数总是在子类中调用:隐式或不隐式。因此,您的ClassB
定义相当于
public ClassB extends ClassA {
public ClassB() {
super();
}
// all other methods you have go here...
}
如果ClassA
的唯一构造函数是私有的,则无法从ClassB
调用它。
答案 4 :(得分:0)
因为儿子必须调用父亲的构造函数才能完成父参数的初始化。
现在 ClassA 是最终类,它的构造函数是私有的。如果 ClassB 扩展了 ClassA。
public class ClassA {
private ClassA() {
}
// add
protected ClassA(String str) {
}
public void display() {
System.out.println("Father's display");
}
}
class ClassB extends ClassA {
public ClassB() {
// add
super(null);
}
public void display() {
System.out.println("Son's display");
}
}