Java基础之父子类静态代码块、代码块、构造函数初始化顺序

该项目源码地址:https://github.com/ggb2312/JavaNotes/tree/master/java-basic

先编写一个父类,有静态代码块、代码块、构造函数

public class SuperClass {

    static {
        System.out.println("父类的静态代码块");
    }

    {
        System.out.println("父类的代码块");
    }

    public SuperClass() {
        System.out.println("父类的构造函数");
    }
}

再编写一个子类继承父类,静态代码块、代码块、构造函数

public class SubClass extends SuperClass {

    static {
        System.out.println("子类的静态代码块");
    }

    {
        System.out.println("子类的代码块");
    }

    public SubClass() {
        System.out.println("子类的构造函数");
    }
}

编写一个测试类

public class Test {
    public static void main(String[] args) {
        new SubClass();
    }
}

运行结果:

父类的静态代码块
子类的静态代码块
父类的代码块
父类的构造函数
子类的代码块
子类的构造函数

即,静态代码块、代码块、构造函数初始化顺序为静态代码块>代码块>=构造函数

父类与子类的初始化顺序为:
父类>子类

原因

  1. 类的初始化优先于类的对象创建(Java类加载的完整过程)。
  2. 子类初始化之前必须先初始化父类(Java类加载的完整过程)。
  3. 子类创建对象时,子类的构造函数会先调用父类的构造函数。
  4. 由于静态代码块是在类的初始化,代码块和构造函数是创建对象时调用的,所以“代码块和构造函数”是一起执行的。

你可能感兴趣的:(Java基础之父子类静态代码块、代码块、构造函数初始化顺序)