以下代码有什么问题,我该如何解决?我的目标是在我的main
方法中使用超类。这个超类对象本身应该创建(在其内部状态下)其子类的实例。
这样做的目的是因为子类只需要超类的状态来处理,并且因为子类需要做的所有操作只对超类有用。
public class Test {
public static void main(String[] args) {
Test2 testSuperclass = new Test2("success #1");
}
}
class Test2 {
public Test2(String printComment) {
System.out.println(printComment);
Test3 testSubclass = new Test3("success #2");
}
}
class Test3 extends Test2 {
public Test3(String printComment2) {
System.out.println(printComment2);
}
}
Test3
构造函数生成错误Implicit super constructor Test2() is undefined. Must explicitly invoke another constructor
。
答案 0 :(得分:3)
构造函数必须做的第一件事是调用超类的构造函数。
通常,您没有看到,因为如果您不指定另一个,Java编译器会自动插入对非参数构造函数(super()
)的调用。但在你的情况下,Test2中没有非参数构造函数(因为你创建了另一个需要String的构造函数)。
public Test3(String printComment2) {
super(printComment2);
System.out.println(printComment2);
}
答案 1 :(得分:0)
添加Thilo的答案,当你没有明确定义super(对父的构造函数的调用)时,隐式调用就是“super()”。所以你基本上允许调用Test2的构造函数,但不传递字符串导致未定义的错误。
答案 2 :(得分:0)
您可以执行以下操作之一:
如果您只想让代码无需任何额外打印或创建对象,请创建一个无参数构造函数:
class Test2 {
public Test2(){
}
public Test2(String printComment) {
System.out.println(printComment);
Test3 testSubclass = new Test3("success #2");
}
}
class Test3 extends Test2 {
public Test3(String printComment2) {
System.out.println(printComment2);
}
}
或者另一种方式是Thio提到的:
public Test3(String printComment2) {
super(printComment2);
System.out.println(printComment2);
}