以下是發生在java繼承關系中靜態代碼塊、代碼塊、構造方法的執行順序的案例:
public class Homework6 { public static void main(String[] args) { new H2(); } } class H1{ { System.out.println("父類代碼塊"); } public H1(){ System.out.println("父類構造"); } static{ System.out.println("父類靜態代碼塊"); } } class H2 extends H1{ static{ System.out.println("子類靜態代碼塊"); } { System.out.println("子類代碼塊"); } public H2(){ System.out.println("子類構造"); } }
執行結果如下所示:
父類靜態代碼塊
子類靜態代碼塊
父類代碼塊
父類構造
子類代碼塊
子類構造
執行流程分析:
1.java程序中靜態內容是隨着類的加載而加載的,由於存在繼承關系,因此先加載父類而后加載子類,相應的就是先執行父類靜態代碼塊,再執行子類靜態代碼塊
2.類加載完成后程序就開始執行main方法中,緊接着進行初始化工作,由於代碼塊執行優於構造方法,因此出現先執行父類代碼塊,再執行父類構造方法,緊接着子類代碼塊,子類構造方法。
3.類的初始化是分層初始化的,先對父類進行初始化,再對子類進行初始化。在目標類中執行順序為:1.成員變量初始化:默認初始化----》顯示初始化----》構造方法初始化