JVM类加载过程中静态变量、(静态)代码块、构造方法、父类子类,变量的加载顺序

话不多说直接给出一串代码:
A类,作为父类:

public class A {

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

    private static String staticStr = getStaticStr();

    private String str = getStr();

    {
        System.out.println("A 代码块");
    }

    public A() {
        System.out.println("A 构造方法");
    }

    private static String getStaticStr() {
        System.out.println("A 静态方法");
        return null;
    }
    private String getStr() {
        System.out.println("A 实例属性初始化");
        return null;
    }

B类,作为子类:

public class B extends A{

    private static String staticStr = getStaticStr();

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

    public B(){
        System.out.println("B 构造方法");
    }

    {
        System.out.println("B 构造块");
    }

    private String str = getStr();

    private static String getStaticStr(){
        System.out.println("B 静态方法");
        return null;
    }

    private String getStr(){
        System.out.println("B 方法");
        return null;
    }
}

main方法:

 public static void main(String[] args) {
        new B();
        new B();
    }

结果是什么呢???可以自己尝试一下,给出提示:

  • 首先是加载父类的静态块和静态变量,他俩的具体顺序要根据代码的前后顺序去判断。
  • 然后是子类的静态块和静态变量。
  • 等静态的都执行完了,就可以开始执行父类的构造块、属性和构造方法了,这三个的顺序主要是根据代码的顺序,但是一定要注意的一点,构造方法一定是最后执行的。
  • 最后,如果一个类已经被加载过了,那么后面的初始化将不会再加载静态代码块和静态变量

所以最后的结果是这样的:

A 静态代码块
A 静态方法
B 静态方法
B 静态代码块
A 实例属性初始化
A 代码块
A 构造方法
B 构造块
B 方法
B 构造方法
A 实例属性初始化
A 代码块
A 构造方法
B 构造块
B 方法
B 构造方法

你可能感兴趣的:(JVM类加载过程中静态变量、(静态)代码块、构造方法、父类子类,变量的加载顺序)