我们知道在 Java 中,当使用 new 操作符创建一个类的对象时,会依次调用该类的静态初始化块、初始化块和构造器。比如下面这个类:
当使用
控制台会打印出
如果有一个类继承了 Super ,并且这个类也有静态初始化块和初始化块,像下面这样:
当使用
控制台会打印出什么呢?经过试验,发现控制台会有如下输出:
这个结果有点儿出乎我的意料,于是开始查阅资料。查了资料资料才知道静态初始化块是在类加载的时候执行的,一个类被加载的时候会先加载其父类。初始化块是在调用构造器之前执行,Java 编译器会把初始化块复制到每个构造器(的最前面),它其实相当于多个构造器的公共部分。所以对于 Sub sub = new Sub(); 会有上面的输出结果。
参考
1、深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)
2、https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html