首页 > 技术文章 > Java 继承关系中初始化顺序

xiaomaomao 2020-11-26 14:48 原文

一、测试代码

// 父类
class Father {
    private static Message a = new Message("父类的静态属性");
    private Message b = new Message("父类的非静态属性b");

    static {
        new Message("父类的静态代码块");
    }

    {
        new Message("父类的非静态代码块");
    }

    private Message c = new Message("父类的非静态属性c");

    public Father() {
        new Message("父类的构造方法");
    }
}

// 子类
class Child extends Father {
    private static Message a = new Message("子类的静态属性");
    private Message b = new Message("子类的非静态属性");

    static {
        new Message("子类的静态代码块");
    }

    {
        new Message("子类的非静态代码块");
    }

    public Child() {
        new Message("子类的构造方法");
    }
}

// 打印信息的类
class Message {
    public Message(String message) {
        System.out.println(message);
    }
}

// 测试类
public class SpringTest {
    public static void main(String[] args) {
        Child child = new Child();
    }
}

二、测试结果

三、总结

1、初始化顺序:静态初始化 ----> 父类初始化 ----> 子类初始化

2、静态成员随着类的加载而加载,优先于对象而存在,所以不管是父类还是子类的静态成员都优先加载

3、同一个类中静态属性和静态代码块是属于同一级别的,谁在前面就先加载谁

4、同一个类中非静态属性和非静态代码块也是属于同一级别的,谁在前面就先加载谁,同时它们的优先级都高于构造方法

 

推荐阅读