順序
1. 父類中靜態成員變量和靜態代碼塊
2. 子類中靜態成員變量和靜態代碼塊
3. 父類中普通成員變量和代碼塊,父類的構造函數
4. 子類中普通成員變量和代碼塊,子類的構造函數
其中“和”字兩端的按照代碼先后順序執行:父類靜態塊→子類靜態塊→父類初始化塊(成員變量,非靜態代碼塊等)→父類構造方法→子類初始化塊(成員變量,非靜態代碼塊等)→子類構造方法
規律
先父后子、先靜態后普通(普通成員變量、普通代碼塊、構造函數按照代碼先后順序執行)
class Parent { /* 靜態變量 */ public static String p_StaticField = "父類--靜態變量"; /* 變量 */ public String p_Field = "父類--變量"; protected int i = 9; protected int j = 0; /* 靜態初始化塊 */ static { System.out.println( p_StaticField ); System.out.println( "父類--靜態初始化塊" ); } /* 初始化塊 */ { System.out.println( p_Field ); System.out.println( "父類--初始化塊" ); } /* 構造器 */ public Parent() { System.out.println( "父類--構造器" ); System.out.println( "i=" + i + ", j=" + j ); j = 20; } } public class SubClass extends Parent { /* 靜態變量 */ public static String s_StaticField = "子類--靜態變量"; /* 變量 */ public String s_Field = "子類--變量"; /* 靜態初始化塊 */ static { System.out.println( s_StaticField ); System.out.println( "子類--靜態初始化塊" ); } /* 初始化塊 */ { System.out.println( s_Field ); System.out.println( "子類--初始化塊" ); } /* 構造器 */ public SubClass() { System.out.println( "子類--構造器" ); System.out.println( "i=" + i + ",j=" + j ); } /* 程序入口 */ public static void main( String[] args ) { System.out.println( "子類main方法" ); new SubClass(); } }
上面的初始化結果是:
-
父類--靜態變量
-
父類--靜態初始化塊
-
子類--靜態變量
-
子類--靜態初始化塊
-
子類main方法
-
父類--變量
-
父類--初始化塊
-
父類--構造器
-
i=9, j=0
-
子類--變量
-
子類--初始化塊
-
子類--構造器
-
i=9,j=20
子類的靜態變量和靜態初始化塊的初始化是在父類的變量、初始化塊和構造器初始化之前就完成了。靜態變量、靜態初始化塊,變量、初始化塊初始化了順序取決於它們在類中出現的先后順序。
例子(必看)
看 [Java對象的初始化] 小節 https://segmentfault.com/a/1190000009707894