规则:
子类的构造的过程中必须调用其基类的构造方法
子类可以在自己的构造方法中使用super(argument_list)调用基类的构造方法
使用this(argument_list)调用本类的另外的构造方法
如果调用super,必须写在子类构造方法的第一行
如果子类的构造方法中没有显示地调用基类构造方法,则系统用默认调用基类无参数的构造方法
如果子类构造方法中既没有显式调用基类构造方法,而基类中又没有无参的构造方法,则编译出错
接下来我们通过一段程序来验证这几条规则
class SuperClass{
private int n;
SuperClass(){
System.out.println("SuperClass()");
}
SuperClass(int n){
System.out.println("SuperClass(" + n +")");
this.n = n;
}
}
class SubClass extends SuperClass{
private int n;
SubClass(int n){
System.out.println("SubClass(" + n + ")");
this.n = n;
}
SubClass(){
super(300);
System.out.println("SubClass()");
}
}
public class TestSuperSub {
public static void main(String[] args) {
SubClass sc1 = new SubClass();//1
SubClass sc2 = new SubClass(400);//2
}
}
如果我们把父类SuperClass 中的SuperClass构造方法和子类SubClass 中的SubClass中的super(300)注释掉 会发生什么呢?
这时报错了,由此证明了一个道理:在子类构造过程中,必须调用父类的构造方法
这里把注释掉的内容全部恢复,再对SubClass方法进行改动
SubClass(){
System.out.println("SubClass()");
super(300);}
这个就已经很明显的解释了
现在将语句1(程序中有注释)暂时注释掉,运行一下程序
运行结果:
看一下程序,明明SubClass并没有对父类调用构造方法,为什么还会输出SuperClass()语句呢?
这里验证了一个规则: 如果子类的构造方法中没有显示地调用基类构造方法,则系统用默认调用基类无参数的构造方法
所以相当于:
SubClass(int n){
super();
System.out.println("SubClass(" + n + ")");
this.n = n;
}
系统自动调用了父类无参数构造方法也就是super()