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

    0
    Java C/C++ Bash Go 8449 次瀏覽
    文首先給出個例子來探究下什么是實例變量初始化器,什么是實例初始化器,以及什么是靜態初始化器。然后看看實例初始化器是怎么工作的。

    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. 什么時候會用到實例初始化器?

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

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

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

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

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

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


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

    相似問題

    相關經驗

    相關資訊

    相關文檔

  • sesese色