class A {
static {
System.out.print("1");
}
public A() {
System.out.print("2");
}
}
class B extends A {
static {
System.out.print("a");
}
public B() {
System.out.print("b");
}
}
public class Hello {
public static void main(String[] args) {
A ab = new B();
ab = new B();
}
}
首先看题目 有AB两个子父类 ,每个类中都有一个静态块与构造实例
然后拆解main方法中的代码块
A ab = new B();
// 上面这行代码 其实就是实例化了一个B对象
// Java代码遵循两个原则,也是我们.class文件的加载机制
// 1. 【静态块在类加载前执行 静态块一定优先于所有实例】
// 2. 【子类对象在实例化时 会优先调用父类】
// 所以静态块中的1,a优先执行 而且父类中的1优于a ==》1,a
// 然后按照父类优先原则 2优于b ==》1,a,2,b
ab = new B();
// 又创建了一个B对象的实例
// 这个时候按顺序执行还是:1,a,2,b
// 但是【静态块中的内容只加载一次】,所以说1,a不再执行
// 最终结果1,a,2,b,2,b