Java範例初始化程式塊


範例初始化程式塊用於初始化範例資料成員。 它在每次建立類的物件時執行。範例變數的初始化可以是直接的,但是可以在初始化範例初始化塊中的範例變數時執行額外的操作。

什麼是範例初始化塊的使用,我們可以直接分配一個值在範例資料成員? 例如:

class Bike{  
    int speed=100;  
}

為什麼要使用範例初始化塊?

假設在賦值給範例資料成員時必須要執行一些操作。 如:使用for迴圈來填充複雜陣列或錯誤處理等。

範例初始化程式塊的範例

下面來看看範例初始化塊執行初始化的簡單例子。

class Bike7 {
    int speed;

    Bike7() {
        System.out.println("speed is " + speed);
    }

    {
        speed = 100;
    }

    public static void main(String args[]) {
        Bike7 b1 = new Bike7();
        Bike7 b2 = new Bike7();
    }
}

執行上面程式碼得到以下結果 -

speed is 100
speed is 100

在Java中有三個地方可以執行範例初始化塊操作:

  1. 方法
  2. 建構函式
  3. 程式碼塊

範例初始化塊或建構函式哪個先呼叫?

看看下面程式碼就知道了。

class Bike8 {
    int speed;

    Bike8() {
        System.out.println("constructor is invoked");
    }

    {
        System.out.println("instance initializer block invoked");
    }

    public static void main(String args[]) {
        Bike8 b1 = new Bike8();
        Bike8 b2 = new Bike8();
    }
}

執行上面程式碼得到以下結果 -

instance initializer block invoked
constructor is invoked
instance initializer block invoked
constructor is invoked

在上面的例子中,似乎首先呼叫範例初始化塊,但是可惜不是。 範例初始化塊在物件建立時被呼叫。 java編譯器在第一個語句super()之後的建構函式中複製範例初始化塊。 首先,呼叫建構函式。 讓我們通過下面的圖來理解它:

注意:java編譯器在每個建構函式中會自動複製範例初始化塊的程式碼。

範例初始化塊的規則:

範例初始化塊主要有三個規則。 它們如下:

  1. 在建立類的範例時建立範例初始化程式塊。
  2. 在父類別建構函式被呼叫之後(即在super()建構函式呼叫之後)呼叫範例初始化塊。
  3. 範例初始化程式塊按它們顯示的順序排列。

super()之後呼叫的範例初始化塊的程式範例:

class A {
    A() {
        System.out.println("parent class constructor invoked");
    }
}

class B2 extends A {
    B2() {
        super();
        System.out.println("child class constructor invoked");
    }

    {
        System.out.println("instance initializer block is invoked");
    }

    public static void main(String args[]) {
        B2 b = new B2();
    }
}

上面程式碼執行結果如下 -

parent class constructor invoked
instance initializer block is invoked
child class constructor invoked

範例塊的另一個範例

class A {
    A() {
        System.out.println("parent class constructor invoked");
    }
}

class B3 extends A {
    B3() {
        super();
        System.out.println("child class constructor invoked");
    }

    B3(int a) {
        super();
        System.out.println("child class constructor invoked " + a);
    }

    {
        System.out.println("instance initializer block is invoked");
    }

    public static void main(String args[]) {
        B3 b1 = new B3();
        B3 b2 = new B3(10);
    }
}

上面程式碼執行結果如下 -

parent class constructor invoked
instance initializer block is invoked
child class constructor invoked
parent class constructor invoked
instance initializer block is invoked
child class constructor invoked 10