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

cd33 9年前發布 | 13K 次閱讀 Java Java開發

文首先給出個例子來探究下什么是實例變量初始化器,什么是實例初始化器,以及什么是靜態初始化器。然后看看實例初始化器是怎么工作的。

1. 執行的順序</h2>

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

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();
}

}</pre>

輸出如下:

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

2. Java的實例初始化器是如何工作的?</h2>

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

除了這么賦值:

int b = 0;

還可以這么寫:

int b;
b = 0;

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

3. 什么時候會用到實例初始化器?</h2>

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

  • 初始化代碼必須處理異常情況
  • 執行一個實例變量沒辦法進行的計算

當然,這些需求還是可以在構造函數中實現的。但是一個類有多個構造函數的話,你就得在每個構造函數里面重復同樣的代碼了。

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

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

參考:Java的初始化
首發:strongme

原文鏈接: programcreek 翻譯: ImportNew.com - strongme
譯文鏈接: http://www.importnew.com/12893.html

 本文由用戶 cd33 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!