public class JavalearningApplicationTests { static { System.out.println("Test的靜態代碼塊"); } public static void main(String[] args) { System.out.println("執行main方法"); B b = new B(); b.excute(); } }
具體類方法:
public class B extends A{ static { System.out.println("ClassB的靜態代碼塊"); } public B() { System.out.println("ClassB的構造方法"); } { System.out.println("ClassB的構造代碼塊"); } public final static B Classb = new B(); public void excute(){ System.out.println("執行方法"); } }
A:
public class A { static { System.out.println("ClassA的靜態代碼塊"); } public A() { System.out.println("ClassA的構造方法"); } { System.out.println("ClassA的構造代碼塊"); } }
執行結果:
Test的靜態代碼塊 執行main方法 ClassA的靜態代碼塊 ClassB的靜態代碼塊 ClassA的構造代碼塊 ClassA的構造方法 ClassB的構造代碼塊 ClassB的構造方法 ClassA的構造代碼塊 ClassA的構造方法 ClassB的構造代碼塊 ClassB的構造方法 執行方法
結論:
1、同一個類中執行先后順序:
靜態代碼塊-->(構造代碼塊-->構造方法)
2、子類和父類的先后順序
父類 靜態代碼塊-->子類 靜態代碼塊
-->父類構造代碼塊--父類構造方法
--子類構造代碼塊--子類構造方法
先父類后子類,構造代碼塊和構造方法一起執行之后再執行子類
3、最后執行對象方法
如果類還沒有被加載:
1、先執行父類的靜態代碼塊和靜態變量初始化,並且靜態代碼塊和靜態變量的執行順序只跟代碼中出現的順序有關。
2、執行子類的靜態代碼塊和靜態變量初始化。
3、執行父類的實例變量初始化
4、執行父類的構造函數
5、執行子類的實例變量初始化
6、執行子類的構造函數