Java Static 加载顺序解析

流程图

flowchart TD
    A(开始) --> B(加载父类的静态变量和静态代码块)
    B --> C(加载子类的静态变量和静态代码块)
    C --> D(加载父类的实例变量和实例代码块)
    D --> E(调用父类的构造方法)
    E --> F(加载子类的实例变量和实例代码块)
    F --> G(调用子类的构造方法)
    G --> H(结束)

代码解析

  1. 加载父类的静态变量和静态代码块
// 父类
public class Parent {
    // 静态变量
    public static String parentStaticField = "Parent Static Field";
  
    // 静态代码块
    static {
        System.out.println("Parent Static Block");
    }
}
  1. 加载子类的静态变量和静态代码块
// 子类
public class Child extends Parent {
    // 静态变量
    public static String childStaticField = "Child Static Field";
  
    // 静态代码块
    static {
        System.out.println("Child Static Block");
    }
}
  1. 加载父类的实例变量和实例代码块
// 父类
public class Parent {
    // 实例变量
    public String parentInstanceField = "Parent Instance Field";
  
    // 实例代码块
    {
        System.out.println("Parent Instance Block");
    }
  
    // 构造方法
    public Parent() {
        System.out.println("Parent Constructor");
    }
}
  1. 加载子类的实例变量和实例代码块
// 子类
public class Child extends Parent {
    // 实例变量
    public String childInstanceField = "Child Instance Field";
  
    // 实例代码块
    {
        System.out.println("Child Instance Block");
    }
  
    // 构造方法
    public Child() {
        System.out.println("Child Constructor");
    }
}

整个加载顺序的流程

  1. 加载父类的静态变量和静态代码块
  2. 加载子类的静态变量和静态代码块
  3. 加载父类的实例变量和实例代码块
  4. 调用父类的构造方法
  5. 加载子类的实例变量和实例代码块
  6. 调用子类的构造方法
  7. 结束

通过以上步骤,你可以清晰地了解Java中static加载顺序的过程。希望这篇文章可以帮助你更好地理解这一概念,加深对Java静态加载顺序的理解。如果有任何疑问,欢迎随时向我提问。


甘特图

gantt
    title Java Static 加载顺序甘特图
    dateFormat  YYYY-MM-DD
    section 静态加载顺序
    加载父类的静态变量和静态代码块 : done, 2022-01-01, 1d
    加载子类的静态变量和静态代码块 : done, 2022-01-02, 1d
    加载父类的实例变量和实例代码块 : done, 2022-01-03, 1d
    调用父类的构造方法 : done, 2022-01-04, 1d
    加载子类的实例变量和实例代码块 : done, 2022-01-05, 1d
    调用子类的构造方法 : done, 2022-01-06, 1d

希望以上内容对你有所帮助,如果还有其他问题需要解答,请随时联系我。祝你学习进步,工作顺利!