class Person {
String name = "No name";
public Person(String nm) {
name = nm;
}
}
class Employee extends Person {
String empID = "0000";
public Employee(String id) {
empID = id;
}
}
public class Test {
public static void main(String args[]) {
Employee e = new Employee("123");
System.out.println(e.empID);
}
}
这段程序会报错:Implicit super constructor Person() is undefined. Must explicitly invoke another constructor
如果子类构造器没有显示地调用超类的构造器,则将自动地调用超类默认(没有参数)的构造器。如果超类没有不带参数的构造器,并且在子类的构造器中有没有显示地调用超类的其他构造器,则Java编译器将报告错误。使用super调用构造器的语句必须是子类构造器的第一条语句。 —《Java核心技术·卷I》
更改为:
class Employee extends Person {
String empID = "0000";
public Employee(String id) {
// super语句必须写在第一行
super(id);
// TODO: do something
empID = id;
}
}
手动显式调用父类构造函数,而且 super语句必须写在第一行。