一、测试代码
// 父类
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、同一个类中非静态属性和非静态代码块也是属于同一级别的,谁在前面就先加载谁,同时它们的优先级都高于构造方法