天天看點

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都是哪個在前面先執行哪個。

如果我的文章對你有幫助,就點一下推薦吧.(*^__^*)