程序示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Super {
String s;
public Super(String s){
this.s = s;
}
}
public class Sub extends Super {
public Sub(){
System.out.println("Sub");
}
public Sub(String s){
this.s = s;
}
public static void main(String[] args){
Sub s = new Sub("a");
}
}
上述程序在编译时会报错:

无法将类Super中的构造器Super应用到给定类型

解释:

编译错误是因为父类中的无参构造器没有被定义。在Java语言中,如果一个类没有定义一个默认构造器,默认情况下,编译器会为这个类插入一个无参构造器。

在这个程序中,父类中定义了一个构造器,即Super(String s),编译器不会再插入一个无参构造器。在子类中,无论是无参构造器还是有参构造器,都将先调用父类的无参构造器,即:

1
2
3
4
5
6
7
8
9
public Sub(){
super();
System.out.println("Sub");
}
public Sub(String s){
super();
this.s = s;
}

当编译器尝试在子类中插入super()时,没有找到父类的无参构造器,因此编译器报错。

解决的办法有:
  • 在父类中添加无参构造器Super(),或直接删去有参构造器Super(String s);

  • 子类的有参构造器改为:

    1
    2
    3
    4
    //仅解决有参构造器调用super()的问题
    public Sub(String s){
    super(s);
    }