java父子類執行順序

1.Parent 父類:

public class Parent {
    static {
        System.out.println("我是父類靜態代碼塊!");
    }

    {
        System.out.println("我是父類非靜態代碼塊!");
    }

    static void static_method() {
        System.out.println("我是父類靜態方法!");

    }

    Parent() {
        System.out.println("我是父類無參構造方法");
    }

    Parent(String arg) {
        System.out.println("我的父類有參構造方法,參數:" + arg);
    }

    public void say() {
        System.out.println("父類一般方法");
    }

}

2.Son子類:

public class Son extends Parent {
    static {
        System.out.println("我是子類類靜態代碼塊!");
    }

    {
        System.out.println("我是子類非靜態代碼塊!");
    }

    static void static_method() {
        System.out.println("我是子類靜態方法!");

    }

    Son() {
        System.out.println("我是子類無參構造方法");
    }

    Son(String arg) {
        System.out.println("我的子類有參構造方法,參數:" + arg);
    }

    @Override
    public void say() {
        System.out.println("子類一般方法");
    }


}

3.test:

public class Test {
    public static void main(String[] args) {
        Parent parent=new Parent();
        //Son son= new Son();
       // Parent son2=new Son();
    }
}

首先

1.創建父類  Parent parent=new Parent()

打印結果:

jdk1.8\jre\lib\rt.jar;F:\Idea代碼存放地址\Parent_test\out\production\Parent_test parent_son.Test
我是父類靜態代碼塊!
我是父類非靜態代碼塊!
我是父類無參構造方法

執行順序爲: 靜態塊->非靜態塊->無參構造

2.創建父類  Parent parent=new Parent("1")

我是父類靜態代碼塊!
我是父類非靜態代碼塊!
我的父類有參構造方法,參數:1

執行順序爲: 靜態塊->非靜態塊->有參構造

3.直接調用父類 靜態方法 static_method();

public class Test {
    public static void main(String[] args) {
       // Parent parent=new Parent("1"); 不創建實例,直接調用靜態方法
            Parent.static_method();
        //Son son= new Sonp();
       // Parent son2=new Son();
    }
}

結果:

我是父類靜態代碼塊!
我是父類靜態方法!

執行順序爲: 靜態塊->靜態塊靜態方法  (只加載類靜態,非靜態的屬於類的實例,因此不創建!)

4.創建子類,Son son= new Son();

public class Test {
    public static void main(String[] args) {
      //  Parent parent=new Parent("1");
        //    Parent.static_method();
        Son son= new Son();
       // Parent son2=new Son();
    }
}

結果:

我是父類靜態代碼塊!
我是子類類靜態代碼塊!
我是父類非靜態代碼塊!
我是父類無參構造方法
我是子類非靜態代碼塊!
我是子類無參構造方法

執行順序爲:父類靜態塊->子類靜態塊->父類非靜態塊->父類無參構造->子類非靜態構造->子類無參構造

   首先依次加載父類和子類靜態塊(屬於類的先加載),再去加載實例化代碼(非靜態和構造)

5.創建子類有參,Son son= new Son("1");

執行結果:

我是父類靜態代碼塊!
我是子類類靜態代碼塊!
我是父類非靜態代碼塊!
我是父類無參構造方法
我是子類非靜態代碼塊!
我的子類有參構造方法,參數:1

執行順序可以看到和無參構造差不多,但是它執行的都是父類無參構造函數

6.直接調用子類靜態方法,Son.static_method();

我是父類靜態代碼塊!
我是子類類靜態代碼塊!
我是子類靜態方法!

執行順序:父類靜態塊->子類靜態塊->子類靜態方法

7.子類向上轉型,Parent son2=new Son();

我是父類靜態代碼塊!
我是子類類靜態代碼塊!
我是父類非靜態代碼塊!
我是父類無參構造方法
我是子類非靜態代碼塊!
我是子類無參構造方法

執行順序:父靜態塊->子靜態塊->父非靜態塊->父無參->子非靜態塊-子無參(或有參)構造

-----------------------------------------------------------------------

總結:

創建對象,一般先加載靜態塊-非靜態塊-構造方法,子類的話是先加載父靜態-子靜態-父非靜態塊-父無參構造-子非靜態塊-子無參或者有參構造;

調用靜態方法,先加載靜態代碼塊  再調用靜態方法

最後,一般方法是最後執行的

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