來說說 Java 中的例項初始化器

strongme發表於2016-08-04

文首先給出個例子來探究下什麼是例項變數初始化器,什麼是例項初始化器,以及什麼是靜態初始化器。然後看看例項初始化器是怎麼工作的。

1. 執行的順序

先看看下面這段程式碼,你覺著哪部分會先被執行呢?

public class Foo {

    //instance variable initializer 例項變數初始化器
    String s = "abc";

    //constructor 建構函式
    public Foo() {
        System.out.println("constructor called");
    }

    //static initializer   靜態初始化器
    static {
        System.out.println("static initializer called");
    }

    //instance initializer 例項變數初始化器
    {
        System.out.println("instance initializer called");
    }

    public static void main(String[] args) {
        new Foo();
        new Foo();
    }
}

輸出如下:

static initializer called
instance initializer called
constructor called
instance initializer called
constructor called

2. Java的例項初始化器是如何工作的?

上面的例子中的例項初始化器包含一段列印字元的程式碼。要理解它是如何工作的,我們可以把它想象成變數賦值的過程,這樣就不難理解了。

除了這麼賦值:

int b = 0;

還可以這麼寫:

int b;
b = 0;

因此,例項初始化器和例項變數初始化器就大同小異了。

3. 什麼時候會用到例項初始化器?

能用到實力初始化器的時候比較少。但有些時候還是一個例項變數初始化器的替代選擇,比如:

  • 初始化程式碼必須處理異常情況
  • 執行一個例項變數沒辦法進行的計算

當然,這些需求還是可以在建構函式中實現的。但是一個類有多個建構函式的話,你就得在每個建構函式裡面重複同樣的程式碼了。

寫在例項初始化器中的程式碼,無論你使用哪一個建構函式,例項初始化器中程式碼都會被執行(可能說的多,用的少吧)。

另一個例項初始化器的應用場景是匿名內部類,因為這種情況下根本就不能建立建構函式。(這可能是放置日誌程式碼的好地方?)

相關文章