1、为什么在实例化子类的对象时,会先调用父类的构造器?
答:子类继承父类后,获取到父类的属性和方法,这些属性和方法在使用前必须先初始化,所以须先调用父类的构造器进行初始化
2、在哪里调用父类的构造器?
答:在子类构造器的第一行会隐式的调用 super();,即调用父类的构造器
如果父类中没有定义空参的构造器,则必须在子类的构造器的第一行显示的调用super(参数); ,以调用父类中构造器
如果子类中构造器的第一行写了this();,则就隐式的super();会消失,因为super()和this()都只能在构造器的第一行定义
补个demo 2021-05-08
public class Parent {
String name;
public Parent() {
System.out.println("Parent类的无参构造器");
}
public Parent(String name) {
System.out.println("Parent类的有参构造器");
this.name = name;
}
}
public class Child extends Parent {
String name;
public Child() {
// 其实这里有隐式的super(),所以看起来打印的顺序是: Parent类的无参构造器->Child类的无参构造器->Child类的有参构造器
System.out.println("Child类的无参构造器");
}
public Child(String name) {
this(); // 注意这个this()
System.out.println("Child类的有参构造器");
this.name = name;
}
}
public class TestConstructor {
public static void main(String[] args) {
new Child("tom");
}
}
再补几张对比图 2021-08-04