1. 程式人生 > >Java靜態程式碼塊、程式碼塊及建構函式執行順序

Java靜態程式碼塊、程式碼塊及建構函式執行順序

根據以下程式進行分析

定義一個父類

package sas.LearnJava;

public class ExcuteOrderTest {
    {
        System.out.println("我是在父類開始的普通程式碼塊!");
    }

    public ExcuteOrderTest() {
        System.out.println("我是父類的無參建構函式!");
    }

    public void showSomething() {
        System.out.println("我是父類中定義的方法!");
    }

    static {
        System.out.println("我是在父類中靜態的程式碼塊!");
    }
}

定義一個子類

package sas.LearnJava;

public class SubExcuteOrderTest extends ExcuteOrderTest {
    static {
        System.out.println("我是在子類中的靜態程式碼塊!");
    }

    public SubExcuteOrderTest() {
        System.out.println("我是子類的無參建構函式!");
    }
    @Override
    public void showSomething() {
        System.out.println("我是子類中定義的方法!");
    }

    public static void test() {
        System.out.println("子類中的靜態測試方法");
    }

    {
        System.out.println("我是在子類結束的普通程式碼塊!");
    }
}

再寫一個demo使用上述子類

package sas.LearnJava;

public class ExcuteOrderDemo {
    public static void main(String[] args) {
        System.out.println("建立第一個物件");
        SubExcuteOrderTest subExcuteOrderTest1 = new SubExcuteOrderTest();
        System.out.println("建立第二個物件");
        SubExcuteOrderTest subExcuteOrderTest2 = new SubExcuteOrderTest();
    }
}
建立第一個物件
我是在父類中靜態的程式碼塊!
我是在子類中的靜態程式碼塊!
我是在父類開始的普通程式碼塊!
我是父類的無參建構函式!
我是在子類結束的普通程式碼塊!
我是子類的無參建構函式!
建立第二個物件
我是在父類開始的普通程式碼塊!
我是父類的無參建構函式!
我是在子類結束的普通程式碼塊!
我是子類的無參建構函式!

從執行結果中可以幾點:

  • 在建立類的物件時會執行其父類中的程式碼塊及預設的無參建構函式,然後再執行自己的程式碼塊和建構函式
  • 靜態程式碼塊、非靜態程式碼塊以及建構函式的執行順序時確定的,與在程式中的位置無關
  • 子類的靜態程式碼塊會在父類的靜態程式碼塊執行後執行
  • 靜態程式碼塊只執行一次,普通程式碼塊隨著物件的建立而重新進行初始化
package sas.LearnJava;

public class ExcuteOrderDemo {
    public static void main(String[] args) {
        SubExcuteOrderTest.test();
    }
}
我是在父類中靜態的程式碼塊!
我是在子類中的靜態程式碼塊!
子類中的靜態測試方法

當不建立物件直接呼叫類的靜態方法時,只會執行父類和子類中的靜態程式碼