Java父類子類加載順序
父類如下:
package zzm.java.extendsDemo; public class Parent { /** * 會報錯,因為static按順序進行加載的 */ // static { // System.out.println("i="+i); // } public static int i = 0; { i++; System.out.println("i(非靜態)="+i); } static { i = i+1; System.out.println("i(靜態)="+i); } { i++; System.out.println("i(非靜態)="+i); } public Parent(){ i++; System.out.println("i(構造方法)="+i); } }
子類如下:
package zzm.java.extendsDemo; public class Child extends Parent{ public static int i = 0; { i++; System.out.println("i(子類非靜態)="+i); } static { i = i+1; System.out.println("i(子類靜態)="+i); } { i++; System.out.println("i(子類非靜態)="+i); } public Child(){ //顯示調用父類構造方法,必須放在最前面,和不寫是一樣的 super(); i++; System.out.println("i(子類構造方法)="+i); } public static void main(String[] args) { Child child1 = new Child(); Child child2 = new Child(); } }
猜猜輸出是啥?
下面是打印
i(靜態)=1 i(子類靜態)=1 i(非靜態)=2 i(非靜態)=3 i(構造方法)=4 i(子類非靜態)=2 i(子類非靜態)=3 i(子類構造方法)=4 i(非靜態)=5 i(非靜態)=6 i(構造方法)=7 i(子類非靜態)=5 i(子類非靜態)=6 i(子類構造方法)=7
由此我們得出下面幾個結論:
1、先執行父類的靜態變量、靜態方法塊,誰在前面誰先執行
2、在執行子類的靜態變量、靜態方法塊,也是一樣,誰在前面誰先執行
3、在執行父類的非靜態變量、非靜態方法塊,接著執行對應子類
4、最后在執行父類構造方法、在執行子類構造方法
5、當類已經被加載后,第二次加載時不會在執行靜態變量的賦值,已經靜態方法塊,但是會執行非靜態變量的賦值和非靜態方法塊。
因為一個靜態變量的初始化是在類加載的準備階段,這個階段會執行靜態變量的賦值以及相關的靜態代碼塊,是<client>()方法執行的,執行時機是類加載的時候
而非靜態方法,是由<init>()方法執行的,執行時間是構造實例的時候,隨著實例化時一起放在堆上

浙公網安備 33010602011771號