Java中父类与子类构造函数的调用次序

  1. 首先看一下这几个代码的执行结果
    Java中父类与子类构造函数的调用次序

结果:
Java中父类与子类构造函数的调用次序

①:每个类在构造的时候,都会有一个默认的无参构造方法;就算我们不写,编译器也会帮助我们生成一个默认的构造方法;但是如果我们写了,那么会使用我们自己写的构造方法。
②:子类的构造过程中,必定会调用其父类的构造方法,就算我们没有写,编译器也会隐式的帮助我们使用super()来调用父类的无参构造方法。
所以在这里进行子类的new时,会先打印父类的无参构造的方法,再调用子类本类的无参构造。

  1. 子类中无参构造方法调用了本类的重载构造
    Java中父类与子类构造函数的调用次序
    结果:
    Java中父类与子类构造函数的调用次序
    在第一个中,子类无参构造方法中,隐式调用了super(),类似下图这样的操作;
    Java中父类与子类构造函数的调用次序
    所以在new一个子类的时候,会先将父类无参构造的方法中的内容打印出来,然后再打印子类无参构造方法中的内容;
    那么这里是怎么回事?正常来说,如果还是在子类无参构造方法中,是不能先调用super()的,如下图:
    Java中父类与子类构造函数的调用次序
    那么super()就不是在子类无参构造中调用的,再看一下下面的代码:
    Java中父类与子类构造函数的调用次序
    代码写成这样后,打印的结果和上面没有在子类重载构造中写super()是一样的,那么就是说,在子类无参构造方法中,使用this调用本类的重载构造方法,那么在子类的无参构造方法中是不能再调用父类的无参构造,也就是没有使用super(),但是子类构造是必须要调用父类构造的,所以就在子类的重载构造中调用了父类的无参构造方法。
    再说明一下执行顺序,不管代码写的时候的调用顺序如何,都是先执行父类的无参构造,再执行子类的无参构造的。

  2. 校验一下上面的总结
    Java中父类与子类构造函数的调用次序