1. 首先, 子类必须调用父类的无参构造器,完成对父类的初始化
package com.hspedu.extend_;
public class Base { // 父类
public Base(){ // 父类无参构造器
System.out.println("父类无参构造器Base()被调用");
}
}
package com.hspedu.extend_;
import com.hspedu.extend_.Base;
public class Sub extends Base { //子类
public Sub(){ // 子类无参构造器
System.out.println("子类无参构造器Sub()被调用");
}
}
运行后我们会发现,先调用了父类的无参构造器完成父类初始化,后才调用了子类的构造器 // 当子类对象创建时,不管使用子类的哪个构造器,默认情况下会先调用父类的无参构造器。 // 如果父类没有无参构造器,则必须在子类构造器中用super()去指定使用父类的哪个构造器去 // 完成对父类的初始化,否则编译无法通过
package com.hspedu.extend_;
public class Base { // 父类
// public Base(){ // 父类无参构造器
// System.out.println("父类无参构造器Base()被调用");
// }
public Base(int x){ // 父类中有参数的构造器,编写后会覆盖掉默认的无参构造器
System.out.println("父类有参数的构造器Base(int x)被调用");
}
}
然后我们将父类中的无参构造器屏蔽, 创建一个有参数的构造器,这时会覆盖掉其默认的无参构造器,当我们创建子类对象时,如果不加以说明,子类就无法调用默认的无参构造器从而编译错误。