類加載器加載順序

先上代碼:

public class Parent {

    {
        System.out.println("Parent的普通代碼塊");
    }

    static {
        System.out.println("Parent的靜態代碼塊");
    }

    public Parent() {
        System.out.println("Parent的構造代碼塊");
    }

    public static void staticMethod1() {
        System.out.println("Parent的靜態代方法1");
    }

    public static void staticMethod2() {
        System.out.println("Parent的靜態代方法2");
    }
}

測試類:

    public static void main(String[] args) {
        Parent.staticMethod1();
        Parent.staticMethod2();
        Parent parent = new Parent();
    }

結果:

Parent的靜態代碼塊
Parent的靜態代方法1
Parent的靜態代方法2
Parent的普通代碼塊
Parent的構造代碼塊

來個子類:

public class Child extends Parent {
    {
        System.out.println("Child的普通代碼塊");
    }

    static {
        System.out.println("Child的靜態代碼塊");
    }

    public Child() {
        System.out.println("Child的構造代碼塊");
    }

    public static void staticMethod1() {
        System.out.println("Child的靜態代方法1");
    }

    public static void staticMethod2() {
        System.out.println("Child的靜態代方法2");
    }
}

測試一下:

    public static void main(String[] args) {
        Child.staticMethod1();
        Child.staticMethod2();
        Child child = new Child();
    }

結果:

Parent的靜態代碼塊
Child的靜態代碼塊
Child的靜態代方法1
Child的靜態代方法2
Parent的普通代碼塊
Parent的構造代碼塊
Child的普通代碼塊
Child的構造代碼塊

加載順序:
父類的靜態代碼塊–> 子類的靜態代碼塊 -->父類的普通代碼塊 -->父類的默認構造器 -->子類的普通代碼塊 -->子類的構造器

子類靜態方法加載在子類靜態代碼塊之後,父類的普通代碼塊之前

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章