在此程序中,super
无需访问超类的构造函数:
class Base{
Base(){
System.out.println("Base");
}
}
public class test2 extends Base{
test2() {
//super();
System.out.print("test2");
}
public static void main(String argv[]){
test2 c = new test2();
}
}
但是这个程序需要super
并在quest1
构造函数中说错误
构造函数
quest
无法应用于给定类型:required int,found no parameters
class Quest {
Quest(int y){
System.out.print("A:"+y);
}
}
class Quest1 extends Quest {
Quest1(int x){
//super(x+1);
System.out.print("B:"+x);
}
}
class Test {
public static void main(String argv[]){
Quest1 q = new Quest1(5);
}
}
答案 0 :(得分:1)
当且仅当您的父super()
没有默认构造函数(接受无参数)时,才需要调用class
。
在所有其他情况下(存在零参数的构造函数),您不必编写代码。无论如何,这是隐含的。
这些规则适用:
super()
; super()
super()
答案 1 :(得分:1)
JLS 8.8.7。构造函数主体
如果构造函数体不是以显式构造函数调用开始,并且声明的构造函数不是原始类
Object
的一部分,那么构造函数体隐式地以超类构造函数调用“super();
开头。 “,调用其直接超类的构造函数,不带参数。
在
class Base {
Base() {
}
}
public class test2 extends Base {
test2() {
//super();
System.out.print("test2");
}
}
注释掉的行会自动添加,因为定义了超类的无参数构造函数,所以没有错误。
在
的情况下class Quest {
Quest(int y) {
System.out.print("A:"+y);
}
}
class Quest1 extends Quest {
Quest1(int x) {
//super(x+1);
System.out.print("B:"+x);
}
}
隐式调用super()
试图在超类中调用未定义的构造函数,这会导致错误
隐式超级构造函数Quest()未定义。必须显式调用另一个构造函数。
取消注释显式构造函数调用会替换隐式调用,从而解决问题。或者,在超类中定义无参数构造函数。
答案 2 :(得分:-1)
如果在超类中创建构造函数,则应在子类构造函数调用之前调用超类构造函数(Ex:super())。