类加载、类初始化、创建对象、对象初始化顺序

先来看一段代码:

public class Father {
    int ii;
    static int fsi = 4;

    {
        System.out.println("4 father");
    }

    static {
        System.out.println("5 father");
    }

    public Father() {
        ii = 1;
        System.out.println("6 father");
    }

    static Son son = new Son();
}
public class Son extends Father {
    private int i = 1;
    private long l = 2L;
    static int ssi = 3;

    {
        System.out.println("1 Son");
    }

    static {
        System.out.println("2 Son");
    }

    public Son() {
        l=3L;
        System.out.println("3 Son");
    }
}
public class Init {

    public static void main(String[] args) {
        Son son = new Son();
    }
}
答案在文末

以前也是懵里懵懂,答得总是不对,今天看了下面文章才算是真的明白了吧。
https://blog.csdn.net/dingshuo168/article/details/102691891

上面的题是对原文章的题做了一丢丢变化,也就是 Parent 中的 static Son son = new Son(); 调换了位置。

以防上面的文章失效,记录下结论

1.static 变量初始化代码和代码块中的代码,在类初始化这步按照在代码中书写的顺序被执行,非 static 同理。

2.javac编译实现:

  • javac 编译器生成一个 方法,把“静态变量的初始化语句”和“static代码块语句”按照代码中的顺序编译到 方法中;
  • javac 编译器把“实例变量的初始化语句”和“实例代码块的语句”按照代码中的顺序编译到了构造方法中;

3.原文中的结果:初始化对象的代码比静态的更早执行,我一直无法理解。也就是 static Son son = new Son() 这句代码。后来理解了:说白了,类初始化就是JVM执行代码的过程

也就是那句代码相当于执行原文下图的 1、2。


image.png

执行结果为:
5 father
4 father
6 father
1 Son
3 Son
2 Son
4 father
6 father
1 Son
3 Son

你可能感兴趣的:(类加载、类初始化、创建对象、对象初始化顺序)