最新整理代码的时候,发现好几年前的一个小测试单元,一起看一下吧
public class Text {
public static void main(String[] args) {
new AA();
}
static class AA extends BB {
static {
System.out.println("1");
}
public AA() {
System.out.println("2");
}
}
static class BB {
static {
System.out.println("3");
}
public BB() {
System.out.println("4");
}
}
AA继承了父类BB,然后各自有自己的静态代码块,各自的构造方法,分别执行各自的打印
你们猜最后的执行顺序是什么? 哈哈 一起看一下执行结果吧!
3
1
4
2
怎么样 ?惊喜不惊喜!意外不意外!
结果是:静态代码块(父)→静态代码块(子)→构造方法(父)→构造方法(子)
其实你仔细想一下就明白这个顺序的道理了
深海个人认为: 系统设计这个顺序的原因有二:
第一,静态代码块的执行,有点像静态属性,它本身可能作为其他方法的影响资源,所以在其他方法执行前,
必须要先执行其资源影响,这就好比古时候打仗一样,兵马未动,粮草先行。哈哈这个比喻不错吧。
第二,父类的静态代码块与方法优先级高于子类,这个是因为父类的初始化会有可能影响子类的逻辑,
并且它有可能是一对多的影响关系,所以父类会优先执行。