结论:
先静态再实例
实例化一个子类(这个颜色主要是实例化会执行的部分):
父类静态属性->父类静态代码块->子类静态属性->子类静态代码块->父类代码块->父类构造函数->子类代码块->子类构造函数
例图:
直接执行子类的静态方法:
父类静态属性->父类静态代码块->子类静态属性->子类静态代码块->子类静态方法
例图:
父类代码:
public class MyParentClass {
// 静态变量
public static String staticStr = "父类静态属性";
static {
System.out.println(staticStr);
System.out.println("父类静态代码块");
}
{
System.out.println("父类代码块");
}
// 构造方法
public MyParentClass() {
System.out.println("父类构造函数");
}
// 静态方法
public static void staticMethod() {
System.out.println("父类静态方法");
}
}
子类代码:
public class MyClass extends MyParentClass{
// 静态变量
public static String staticStr = "子类静态属性";
static {
System.out.println(staticStr);
System.out.println("子类静态代码块");
}
{
System.out.println("子类代码块");
}
// 构造方法
public MyClass() {
System.out.println("子类构造函数");
}
// 静态方法
public static void staticMethod() {
System.out.println("子类静态方法");
}
}
测试类:
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
//Class.forName("cn.fw.community.adapter.assembler.MyClass"); // 调用类加载,触发类初始化
MyClass.staticMethod(); // 调用静态方法,触发类初始化
//MyClass obj = new MyClass();
}
}