1. 程式人生 > >建構函式、靜態語句塊、非靜態語句塊的執行順序

建構函式、靜態語句塊、非靜態語句塊的執行順序

1.用來測試的父類

package staticConstruct;

public class TestFather {
	public TestFather() {
		System.out.println("我是無引數構造,父類");
	}

	public TestFather(String a) {
		System.out.println("我是有引數構造,父類,引數是" + a);
	}

	// 非靜態語句塊
	{
		System.out.println("我是父類的非靜態語句塊!");
	}
	// 靜態語句塊
	static {
		System.out.println("我是父類的靜態語句塊!");
	}

}

2.用來測試的子類

package staticConstruct;

public class TestSon extends TestFather {
	public TestSon() {
		System.out.println("我是子類的無引數構造!");
	}

	public TestSon(String a) {
		System.out.println("我是子類的有引數構造,引數是" + a);
	}

	// 非靜態語句塊
	{
		System.out.println("子類的非靜態語句塊!");
	}
	// 靜態語句塊
	static {
		System.out.println("子類的靜態語句塊!");
	}
}

3.測試方法類

package staticConstruct;

public class TestOrder {
	public static void main(String[] args) {
		/**
		 * 子類的靜態語句塊! 我是父類的非靜態語句塊! 我是父類的靜態語句塊! 我是無引數構造,父類 子類的非靜態語句塊! 我是子類的無引數構造!
		 */
		new TestSon();
		// new TestSon("a");
	}

}
new TestSon()輸出結果:

我是父類的靜態語句塊!
子類的靜態語句塊!
我是父類的非靜態語句塊!
我是無引數構造,父類
子類的非靜態語句塊!
我是子類的無引數構造!

new TestSon("a")輸出結果:

我是父類的靜態語句塊!
子類的靜態語句塊!
我是父類的非靜態語句塊!
我是無引數構造,父類
子類的非靜態語句塊!
我是子類的有引數構造,引數是a

測試結果:執行順序是父類靜態語句塊>子類靜態語句塊>父類非靜態語句塊>父類的構造>子類的非靜態語句塊>子類的構造
總結:1.靜態語句塊優先順序最高,父類的高於子類的;
2.非靜態語句塊先於構造先執行,先執行父類的再執行子類的。