1. 程式人生 > 其它 >java程式的初始化順序

java程式的初始化順序

使用場景

在java程式中,當例項化物件時,物件的所在類的所有成員變數首先要進行初始化,只有當所有類成員完成初始化後,才會呼叫物件所在類的建構函式建立物件。

原則

變數優先於塊、靜態優先於非靜態。
父類優先於派生類初始化。
按照成員變數定義的順序來進行初始化,即使變數定義散佈於方法定義之中,它們仍然在任何方法(包括構造器)被呼叫前初始化。

初始化順序

父類靜態變數
父類靜態程式碼塊
子類靜態變數
子類靜態程式碼塊
父類非靜態變數
父類非靜態程式碼塊
父類建構函式
子類非靜態變數
子類非靜態程式碼塊
子類建構函式

初始化示例程式碼

class Base {

    public Base() {
        System.out.println("父類構造方法");
    }

    String b = "父類非靜態變數";
    {
        System.out.println(b);
        System.out.println("父類非靜態程式碼塊");
    }

    static String a = "父類靜態變數";

    static {
        System.out.println(a);
        System.out.println("父類靜態程式碼塊");
    }

    public static void A() {
        System.out.println("父類普通靜態方法");
    }

}

class Derived extends Base {

    public Derived() {
        System.out.println("子類構造器");
    }

    String b = "子類非靜態變數";
    {
        System.out.println(b);
        System.out.println("子類非靜態程式碼塊");
    }

    static String a = "子類靜態變數";

    static {
        System.out.println(a);
        System.out.println("子類靜態塊");
    }

    public static void A() {
        System.out.println("子類普通靜態方法");
    }

    public static void main(String[] args) {
        Base.A();
        Derived.A();
        new Derived();
    }
}

分別執行主函式裡的三條指令,執行結果如下。

Base.A()
父類靜態變數
父類靜態程式碼塊
子類靜態變數
子類靜態塊
父類普通靜態方法

Derived.A()
父類靜態變數
父類靜態程式碼塊
子類靜態變數
子類靜態塊
子類普通靜態方法

new Derived()
父類靜態變數
父類靜態程式碼塊
子類靜態變數
子類靜態程式碼塊
父類非靜態變數
父類非靜態程式碼塊
父類建構函式
子類非靜態變數
子類非靜態程式碼塊
子類建構函式