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.