Java类初始化加载过程

联动:为什么构造代码块先于构造函数执行?

梳理一下Java中类的加载顺序~

//父类
public class Father {

    static {
        System.out.println("父类静态代码块...");
    }

    {
        System.out.println("父类构造代码块...");
    }

    public Father() {
        System.out.println("父类构造函数...");
    }

    public void run() {
        System.out.println("父类方法...");
    }

}

//子类
public class Son extends Father {

    public static int a = 1;

    static {
        a = 2;
        System.out.println("子类静态代码块...");
    }

    public String name;

    public Son(String name) {
        System.out.println("子类构造函数...");
        this.name = name;
    }

    {
        a = 3;
        System.out.println("子类构造代码块...");
    }

    @Override
    public void run() {
        System.out.println("子类复写父类方法: " + a);
    }

    public static void main(String[] args) {
        Father father = new Son("java boy");
        father.run();
        new Son("java boy");
    }

}

打印结果:

父类静态代码块...
子类静态代码块...
父类构造代码块...
父类构造函数...
子类构造代码块...
子类构造函数...
子类复写父类方法: 3
父类构造代码块...
父类构造函数...
子类构造代码块...
子类构造函数...

结论:

1. 父类先于子类进行初始化;
2. 静态代码块随着类的加载而加载,且只执行一次;
3. 构造代码块先于构造函数执行,两者每new一次就执行一次;
4. 从以上3点可以得出执行顺序:父类静态代码块->子类静态代码块->父类构造代码块->父类构造函数->子类构造代码块->子类构造函数。

你可能感兴趣的:(Java类初始化加载过程)