java 靜態變量 靜態代碼塊 加載順序問題


在網上看了一個這樣的題目

public class StaticTest {

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

    static StaticTest st = new StaticTest();

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

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

    StaticTest() {
        System.out.println("3");
        System.out.println("a=" + a + ",b=" + b);
    }

    public static void staticFunction() {
        System.out.println("4");
    }

    int a = 110;
    static int b = 112;
}

問輸出順序是什么?

正確答案是:

2
3
a=110,b=0
1
4

產生這個結果的原因的關鍵在這一句話: 
static StaticTest st = new StaticTest(); 
st變量的引用是本類的實例,因此在實例化st變量時,將實例初始化嵌入到靜態初始化中。因為這一句放在靜態初始化的開頭,所以static int b=112沒有被調用,輸出的b=0,同時,輸出1也在2和3后面。在對象的初始化時,也是先初始化環境變量,再執行構造函數,a的值為100。

后面我在想把static int b = 112放到st之前會發生什么

public class StaticTest {

    public static void main(String[] args) {
        staticFunction();
    }
    static int b = 112;
    static StaticTest st = new StaticTest();

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

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

    StaticTest() {
        System.out.println("3");
        System.out.println("a=" + a + ",b=" + b);
    }

    public static void staticFunction() {
        System.out.println("4");
    }

    int a = 110;
}

執行結果:

2
3
a=110,b=112
1
4

b有值了。所以b在st聲明前賦值,st實例化的時候b就有值了。說明靜態變量之間實例化是按代碼順序執行的。

如果把靜態代碼塊,提到st之前會發生什么呢?

public class StaticTest {

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

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

    static StaticTest st = new StaticTest();

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

    StaticTest() {
        System.out.println("3");
        System.out.println("a=" + a + ",b=" + b);
    }

    public static void staticFunction() {
        System.out.println("4");
    }

    int a = 110;
    static int b = 112;
}

執行結果:

1
2
3
a=110,b=0
4

發現執行順序變了,它會先執行靜態代碼塊,再執行st的實體化。

這邊,我發現靜態代碼塊與靜態成員變量的初始化居然和代碼順序有關

所以不管是靜態代碼塊還是靜態成員變量,java都是哪個在前面先執行哪個。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM