众所周知,对于Java中的所有类而言,它们有一个根父类,即java.lang.Object类。
对于Java中构造器执行的顺序而言,程序执行的顺序为,先执行父类的非静态代码块,然后执行父类的相应的构造器,最后执行子类的非静态代码块,
子类的构造器。
此处需要说明一点:Java中的静态代码是在字节码文件在最开始加载的时候就完成的哦。
为了更好的理解,请看下面的例子:
class Creature { { System.out.println("Creature的非静态初始化块"); } // 下面定义两个构造器 public Creature() { System.out.println("Creature无参数的构造器"); } public Creature(String name) { // 使用this调用另一个重载的、无参数的构造器 this(); System.out.println("Creature带有nmae参数的构造器,name参数:" + name); } } class Animal extends Creature { { System.out.println("Animal的非静态初始化块"); } public Animal(String name) { super(name); System.out.println("Animal带一个参数的构造器,name参数:" + name); } public Animal(String name , int age) { // 使用this调用另一个重载的构造器 this(name); System.out.println("Animal带2个参数的构造器,其age:" + age); } } class Wolf extends Animal { { System.out.println("Wolf的非静态初始化块"); } public Wolf() { // 显式调用父类的带2个参数的构造器 super("灰太狼", 3); System.out.println("Wolf无参数的构造器"); } public Wolf(double weight) { // 使用this调用另一个重载的构造器 this(); System.out.println("Wolf的带weight参数的构造器,weight参数:" + weight); } } public class InitTest { public static void main(String[] args) { new Wolf(5.6); } }
运行结果为:
Creature的非静态初始化块 Creature无参数的构造器 Creature带有nmae参数的构造器,name参数:灰太狼 Animal的非静态初始化块 Animal带一个参数的构造器,name参数:灰太狼 Animal带2个参数的构造器,其age:3 Wolf的非静态初始化块 Wolf无参数的构造器 Wolf的带weight参数的构造器,weight参数:5.6