抽象类的有参与无参构造函数的研究
即使我们声明一个没有构造函数的抽象类,编译器还会为我们生成一个默认的保护级别的构造函数。子类实例化时(不管是否为带参构造)只会调用所有父类的无参构造函数,而带参构造必须通过显式去调用.调用顺序是先调用抽象类的无参构造函数,如果子类实例化时是使用带餐的构造函数,则再接着调用抽象类的带参构造函数,最后调用子类本身的构造函数。
abstract class Person { //定义一个抽象类,必须被继承
public Person(){
System.out.println("调用的是父类的无参构造函数");
}
public Person(int i) {
System.out.println("调用的是父类的有参构造函数");
}
}
class Student extends Person {
// 想调用父类抽象类的有参构造函数必须先显式声明,然后通过super函数调用
Student(int i) {
super(i);
//必须显示的调用父类构造方法,super代表父类对象
System.out.println("子类的有参构造函数\n");
}
//默认调用父类的无参构造函数,同样必须显式声明
Student(){
System.out.println("子类的无参构造函数");
}
}
public class Test {
public static void main(String[] args) {
int i=0;
Student 有参 = new Student(i);
Student 无参 = new Student();
}
}
结果:
调用的是父类的有参构造函数
子类的有参构造函数
调用的是父类的无参构造函数
子类的无参构造函数