13. .class文件加载机制

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
原文地址:https://www.cnblogs.com/forelim/p/15408414.html