天天看點

Java類靜态代碼塊、構造塊、構造器的執行順序

代碼:

public class TestClass {

    static {
        System.out.println("1");
    }

    {
        System.out.println("2");
    }

    public TestClass() {
        System.err.println("3");   //注意這裡是err,不是out
    }

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

問:輸出結果是什麼?

很有趣的是,不同的情況有不同的結果。

使用MyEclipse、Intellij Idea等IDE工具運作時,結果不定。有時是:

1

2

3

有時又是:

還有可能是

甚至還有這種的:

31

大家沒看錯哈,3和1就是在一行的,同時與2之間就是有那麼一個空白行。不知為啥,請大神求解。

上面的結果是在IDE中運作。而假如手動編譯源檔案,手動運作,結果又不一樣了。看截圖:

上面結果無論是對TestClass.java編譯一次,多次運作還是多次編譯多次運作,結果始終一樣,都是上圖你看到的結果。

有趣吧?哈哈

如有大神知曉,為什麼IDE中結果不定,而手動運作結果一緻的緣由,還望指教指教!

另外還有趣的是,上面的代碼不是特意注釋了構造器中的代碼是 err,而不是 out 嗎,現在把這個err改為out,那麼無論是在IDE中執行還是手動編譯執行,運作結果都是

什麼原因啊?

無論怎樣,個人認為手動運作的結果是正确的,其他不同的結果應該是受IDE環境的影響。是以可以得出結論靜态代碼塊、構造塊、構造器的執行順序是:

靜态代碼塊-->構造塊-->構造器(構造函數)。