看以下代碼:
class A { static { System.out.println("A的static代碼塊..."); } public String s1 = prtString("A的成員變量..."); public static String s2 = prtString("A的static變量..."); protected A() { System.out.println("A的構造函數..."); } { System.out.println("A的代碼塊"); } public static String prtString(String str) { System.out.println(str); return null; } } class B extends A { public String ss1 = prtString("B的成員變量..."); public static String ss2 = prtString("B的static變量..."); public B() { System.out.println("B的構造函數..."); } static { System.out.println("B的static代碼塊..."); } { System.out.println("B的代碼塊..."); } } public class Test { public static void main(String[] args) { System.out.println("主函數運行"); B b=new B(); } }
運行結果:
由上可以得出運行順序:
1. 父類靜態成員和靜態初始化塊 ,按在代碼中出現的順序依次執行
2. 子類靜態成員和靜態初始化塊 ,按在代碼中出現的順序依次執行
3. 父類實例成員和實例初始化塊 ,按在代碼中出現的順序依次執行
4. 父類構造方法
5. 子類實例成員和實例初始化塊 ,按在代碼中出現的順序依次執行
6. 子類構造方法
順序是:當創建類對象時,先初始化靜態變量和靜態塊,然后是非靜態變量和非靜態代碼塊,然后是構造器。由於靜態成員只會被初始化一次,所以如果靜態成員已經被初始化過,將不會被再次初始化
參考文章:
https://blog.csdn.net/lichuangcsdn/article/details/80862036
https://www.cnblogs.com/ipetergo/p/6852790.html