Java初始化塊


範例初始化塊

範例初始化塊用於初始化類的物件。一個範例初始化程式只是一個類的程式碼塊,但在任何方法或建構函式之外。範例初始值設定程式沒有名稱。它的程式碼只是放置在一個開放的大括號和閉包中。

範例

下面的程式碼展示了如何為Test類宣告一個範例初始化器。注意,範例初始化程式在範例上下文中執行,並且關鍵字this在範例初始化程式中可用。

class Test {
  private int num;
  // An instance initializer
  {
    this.num = 101;

    /* Other code for the instance initializer*/
  }

  /* Other code for Test class*/
}

多重範例初始化

一個類可以有多個範例初始化器。對於建立的每個物件,它們都以文字順序自動執行。所有範例初始值的程式碼在任何建構函式之前執行。
下面的程式碼演示了建構函式和範例初始化函式的執行順序。

public class Main {
  {
    System.out.println("Inside instance initializer 1.");
  }

  {
    System.out.println("Inside instance initializer 2.");
  }

  public Main() {
    System.out.println("Inside  no-args constructor.");
  }

  public static void main(String[] args) {
    Main m = new Main();
  }
}

上面的程式碼生成以下結果。

Inside instance initializer 1.
Inside instance initializer 2.
Inside  no-args constructor.

範例初始化程式中不能有return語句。

靜態初始化塊

靜態初始化塊也稱為靜態初始化器。它類似於範例初始化塊。

它用於初始化一個類。 每個物件執行一個範例初始化器,而當類定義被載入到JVM中時,只對一個類執行一次靜態初始化器。需要在其宣告的開頭使用static關鍵字。

在一個類中可以有多個靜態初始化器。 所有靜態初始化器都按文字出現的順序執行,並在任何範例初始化器之前執行。

以下程式碼演示了何時執行靜態初始化程式。

public class Main {
  private static int num;
  {// An instance initializer
    System.out.println("Inside instance initializer.");
  }
  // A static initializer. Note the use of the keyword static below.
  static {
    num = 2018;
    System.out.println("Inside static initializer.");
  }

  // Constructor
  public Main() {
    System.out.println("Inside constructor.");
  }

  public static void main(String[] args) {
    System.out.println("Inside  main() #1.   num: " + num);
    // Declare a reference variable of the class
    Main si;
    System.out.println("Inside  main() #2.   num: " + num);
    new Main();    // Create an object

    System.out.println("Inside  main() #3.   num: " + num);
    new Main();// Create another object
  }
}

上面的程式碼生成以下結果。

Inside static initializer.
Inside  main() #1.   num: 2018
Inside  main() #2.   num: 2018
Inside instance initializer.
Inside constructor.
Inside  main() #3.   num: 2018
Inside instance initializer.
Inside constructor.