父类B静态代码块->父类B构造函数->子类A静态代码块->父类B非静态代码块->子类A构造函数->子类A非静态代码块
父类B静态代码块->父类B构造函数->父类B非静态代码块->子类A静态代码块->子类A构造函数->子类A非静态代码块
父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数
父类B构造函数->父类B静态代码块->父类B非静态代码块->子类A静态代码块->子类A构造函数->子类A非静态代码块
静态初始化块在类加载时执行,而加载当前类时会先加载父类(如果父类没有被加载)。
因此会先执行父类静态初始化块,再执行子类静态初始化块。
一个类的非静态初始化块会比构造方法先执行,执行顺序是先父类,后子类。
所以接下来是父类的非静态初始化块,父类构造方法,子类的非静态初始化块,子类构造方法。
如果当前类和父类都以被加载,那么只会执行非静态初始化块和构造方法。
public class Parent {
static {
System.out.println("父类静态初始化块");
}
{
System.out.println("父类非静态初始化块");
}
public Parent() {
System.out.println("父类构造方法");
}
//方法与类名同名
public int Parent() {
return 0;
}
public static void main(String... args) {
//第一次创建时类还没有被加载,会执行静态初始化块
Child c = new Child();
//第二次创建时类已经被加载,只执行非静态初始化块和 构造方法
Child d = new Child();
}
}
class Child extends Parent {
public Child() {
System.out.println("子类构造方法");
}
static {
System.out.println("子类静态初始化块");
}
{
System.out.println("子类非静态初始化块");
}
}
上面代码输出结果为:
父类静态初始化块
子类静态初始化块
父类非静态初始化块
父类构造方法
子类非静态初始化块
子类构造方法
父类非静态初始化块
父类构造方法
子类非静态初始化块
子类构造方法
Class Static Block:Class Static Variable
Super Class Block
Super Class Constructor Method
Class Block
Constructor Method