java类加载执行顺序

问题相关代码,请勿粘贴截图
static class Father {
    public static int a = 1;

    static {
        System.out.println("执行father static object a=" + a);
        a = 2;
    }

    {
        System.out.println("执行 father object a=" + a);
    }

    public Father() {
        System.out.println("执行 Father construct a=" + a);
        a = 6;
    }
}

static class Son extends Father {
    static {
        System.out.println("执行 Son static object a=" + a);
        a = 3;
    }

    {
        System.out.println("执行 Son object a=" + a);
    }

    public Son() {
        System.out.println("执行 Son construct a=" + a);
        a = 4;
    }
}

@Test
public void testLoad() {

// Father father =new Son();
System.out.println(Son.a);
}

运行结果及报错内容

代码输出2, 说明只执行了父类的静态代码块,子类的静态代码块为啥不执行

静态代码块在类加载的时候只会执行一次~子类继承父类,会先执行父类的代码块。

通过子类引用父类的静态字段不会导致子类的初始化

首先你把 Father father =new Son(); 注释掉了,因此只有一条语句 System.out.println(Son.a); 执行了。

那么这条语句打印 Son 类的静态成员 a,不过 Son 没有声明这个成员,它实际上指的是 Father.a。

好,那么整个初始化过程是:

  1. 加载类 Son
  2. 加载类 Father
  3. 加载和初始化类 Object (这段不管)
  4. 因为 Father 是父类,因此要首先初始化它,即 a = 2
  5. 因为此时已经找到 Father.a 成员了,JVM 就立刻执行 System.out.println,至于 Son 类就不用初始化了。