该项目源码地址:https://github.com/lastwhispers/code/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();
}
}
运行结果:
父类的静态代码块
子类的静态代码块
父类的代码块
父类的构造函数
子类的代码块
子类的构造函数
即,静态代码块、代码块、构造函数初始化顺序为静态代码块>代码块>=构造函数
父类与子类的初始化顺序为:
父类>子类
原因
- 类的初始化优先于类的对象创建(Java类加载的完整过程)。
- 子类初始化之前必须先初始化父类(Java类加载的完整过程)。
- 子类创建对象时,子类的构造函数会先调用父类的构造函数。
- 由于静态代码块是在类的初始化,代码块和构造函数是创建对象时调用的,所以“代码块和构造函数”是一起执行的。