Java中的繼承關係的載入順序,java繼承載入順序
/*在載入類時,Java虛擬機器先載入父類再載入子類,再對靜態初始化塊、靜態成員變數(類變數)、靜態方法進行一次初始化。只有調用new方法時才會建立類的對象。按照父子繼承關係進行初始化,首先執行父類的初始化塊部分,然後是父類的構造方法,再執行子類的初始化塊,最後是子類的構造方法。銷毀對象的過程是:首先銷毀子類部分,再銷毀父類部分。*/public class InheritanceLoadOrder {public static void main(String[] args) {System.out.println("不建立對象直接存取靜態方法時的輸出:");Child.childMethod();System.out.println("\n\t>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");System.out.println("通過new建立對象,訪問非靜態方法時的輸出:");new Child("").display();System.gc();//通知虛擬機器進行記憶體回收}}class Parent{private int x = 15;private static int y = getValue(20);{System.out.println("執行Parent的初始化代碼塊");int x = 70;int y = getValue(30);}static{System.out.println("執行Parent的靜態初始化代碼塊");int sx = 70;int sy = getValue(30);}public Parent(){System.out.println("Parent預設建構函式被調用");}public void display(){System.out.println("Parent的display方法被調用");System.out.println("x = " + this.x + " ; y = " + y);parentMethod();}public static void parentMethod(){System.out.println("Parent的parentMethod方法被調用");}public static int getValue(int num){System.out.println("Parent的getValue(int num)方法被調用");return ++num;}//當Java在進行記憶體回收時,會自動地調用對象的finalize()方法protected void finalize(){System.out.println("Parent對象被垃圾收回器收回");}}class Child extends Parent{{System.out.println("執行Child的初始化代碼塊");int z = 30;}static {System.out.println("執行Child的靜態初始化代碼塊");}public Child(){super();System.out.println("Child的構造方法被調用");}public Child(String str){System.out.println("Child帶參的構造方法被調用");}public static void childMethod(){System.out.println("Child的childMethod方法被調用");}//當Java在進行記憶體回收時,會自動地調用對象的finalize()方法protected void finalize(){System.out.println("Child對象被垃圾收回器收回");}}/*只有在建立一個對象時,才會按先父類後子類的順序初始化類的初始化塊、構造方法等。如果只訪問類的靜態方法,Java虛擬機器不會初始化這些代碼。對於每個類,Java虛擬機器只載入一次,在載入時,初始化類的靜態方法、靜態變數以及靜態初始化塊。System類的gc()方法用於通知Java虛擬機器進行記憶體回收,但不保證會立即執行,至於何時進行記憶體回收,完全由虛擬機器決定。在進行記憶體回收時,虛擬機器會調用對象的finalize()方法。*/
運行結果: