天天看點

靜态屬性靜态代碼塊加載順序

class A {
	private static String staticStr = getStaticStr();

	private String str = getStr();

	static {
		System.out.println("A的靜态塊");
	}

	{
		System.out.println("A的執行個體塊");
	}

	public A() {
		System.out.println("A的構造方法");
	}

	private static String getStaticStr() {
		System.out.println("A的靜态屬性初始化");
		return null;
	}

	private String getStr() {
		System.out.println("A的執行個體屬性初始化");
		return null;
	}
}

class B extends A {
	private static String staticStr = getStaticStr();

	private String str = getStr();

	static {
		System.out.println("B的靜态塊");
	}

	{
		System.out.println("B的執行個體塊");
	}

	public B() {
		System.out.println("B的構造方法");
	}

	private static String getStaticStr() {
		System.out.println("B的靜态屬性初始化");
		return null;
	}

	private String getStr() {
		System.out.println("B的執行個體屬性初始化");
		return null;
	}

	public static void main(String[] args) {
		new B();
		new B();
	}
}
           

輸出結果是:

A的靜态屬性初始化

A的靜态塊

B的靜态屬性初始化

B的靜态塊

A的執行個體屬性初始化

A的執行個體塊

A的構造方法

B的執行個體屬性初始化

B的執行個體塊

B的構造方法

A的執行個體屬性初始化

A的執行個體塊

A的構造方法

B的執行個體屬性初始化

B的執行個體塊

B的構造方法

由此可見,執行個體化子類的時候,若此類未被加載過,首先加載是父類的類對象,然後加載子類的類對象,接着執行個體化父類,最後執行個體化子類,若此類被加載過,不再加載父類和子類的類對象。接下來是加載順序,當加載類對象時,首先執行靜态屬性初始化,然後執行靜态塊,當執行個體化對象時,首先執行執行個體塊,然後執行構造方法,至于各靜态塊、執行個體塊之間的執行順序,是按代碼的先後順序