Java静态代码块和静态属性加载顺序

Java静态代码块、静态属性、构造函数加载顺序

代码实例

//父类
public class B {
    public static B t1 = new B();
    public static B t2 = new B();
    public B(){
    	super();
        System.out.println("B类构造块");
    }
    static {
        System.out.println("B类静态块");
    }
}
//子类
public class A extends B {
    public static A t1 = new A();
    public static A t2 = new A();
    public A(){
    	super();
        System.out.println("A类构造块");
    }
    static {
        System.out.println("A类静态块");
    }
    public static void main(String[] args) {
        A t = new A();
    }
}

运行结果如下

B类构造块 //①
B类构造块 //②
B类静态块 //③
B类构造块 //④
A类构造块 //⑤
B类构造块 //⑥
A类构造块 //⑦
A类静态块 //⑧
B类构造块 //⑨
A类构造块 //⑩

原因解析

规则:
静态块 随着类的加载(例如:1、A继承B 加载B;2运行A 加载A)而执行,且只执行一次,并优先于Main方法,用于给类初始化的。
构造块 当实例化即new的时候 立即执行。
继承时,先加载父类,再加载子类。
实例化子类时,先实例化父类。
加载类时,成员变量及代码块顺序执行。
本例分析:
A extends B ,
-----先加载B,B中实例化t1、t2,立即执行构造块,故①、②,然后继续执行静态代码块,故③,此时B类已经加载完毕,
-----然后加载A,A中实例化t1、t2,先实例化B,故④、⑤,⑥、⑦,然后继续执行A中静态代码块,故⑧,然后执行主方法,故⑨、⑩。

你可能感兴趣的:(Java)