规则: 子类的构造的过程中必须调用其基类的构造方法 子类可以在自己的构造方法中使用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()
