继承结构中,父类的构造器只能够被调用,而不能被子类继承。 调用父类的构造方法要在子类的构造器中使用super()
。
“对于子类,其构造器的正确初始化是非常重要的,而且当且仅当只有一个方法可以保证这点:在构造器中调用父类构造器来完成初始化,而父类构造器具有执行父类初始化所需要的所有知识和能力。”
正常情况下,子类会默认自动调用父类的构造器(无参的,不管是自己手动写的的还是系统自动新建的),但是如果父类没有无参构造器,子类必须要显式地调用父类的带参构造器,而且必须是在子类构造器中做的第一件事(第一行代码)。
请看简短的代码:
class Person {
protected String name;
Person(String name) {
System.out.println("Person Constrctor-----" + name);
}
Person() {
System.out.println("Person Constrctor-----");
}
}
public class Husband extends Person {
Husband() {
// 从结果可以看出,系统自动调用的父类的Person()方法
System.out.println("Husband Constructor...");
}
public static void main(String[] args) {
Husband husband = new Husband();
}
}
运行结果:
Person Constrctor-----
Husband Constructor...
再看,对比一下有参的时候的情况:
class Person {
protected String name;
Person1(String name) {
System.out.println("Person Constrctor-----" + name);
}
}
public class Husband extends Person {
Husband() {
/**
* 必须在这显式地调用父类的构造函数,否则会报错,因为父类里面我们新建了一
* 个自定义了带参构造器,而没有重载一个无参构造器
* 系统就不会为我们新建默认构造器了,在这里也就自然不会隐式地调用父类的
* 默认构造器
*/
super("chenssy");
System.out.println("Husband Constructor...");
}
public static void main(String[] args) {
Husband husband = new Husband();
}
}
运行结果:
Person Constrctor-----chenssy
Husband Constructor...