public class LoadingSequence {
public static void main(String[] args) {
System.out.println(BX.c);
}
}
class AX{
static {
System.out.println("A");
}
}
class BX extends AX{
static {
System.out.println("B");
}
public static final String c = "C";
}
这道题的运行结果是C,如果将final去掉结果是ABC,原因就是使用final修饰的常量在程序编译时期就将常量C放入了常量池,而调用常量c不需要将类初始化,所以就不需要加载static代码块,这就是为什么将final去掉之后才是ABC的原因。
什么是常量?常量是用final修饰的成员变量!常量在类编译时期载入类的常量池中。
静态代码块的加载顺序:父类的静态代码块>子类的静态代码块>父类非静态代码块>父类构造方法>子类非静态代码块>子类构造方法
注意:
默认该类及其父类JVM未曾加载过
先父后子,先静后常再构造
同等级内代码逐条按顺序执行
当静态代码和非静态代码中成员变量包含对象,也会先执行该对象类的静态代码和构造函数