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

先来看一段代码:

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 编译器生成一个 <clinit> 方法,把“静态变量的初始化语句”和“static代码块语句”按照代码中的顺序编译到 <clinit> 方法中;
  • 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容