Java的靜態變數,成員變數,靜態代碼塊,構造塊的載入順序__日常問題

來源:互聯網
上載者:User

問題的產生來自下面這個連結(http://bbs.csdn.net/topics/391908395)

public class StaticTest{    public static void main(String args[]){        staticFunction();    }    static StaticTest st = new StaticTest();    static{        System.out.println("1");    }    StaticTest(){        System.out.println("3");        System.out.println("a="+a+" b="+b);    }    public static void staticFunction(){        System.out.println("4");    }    {        System.out.println("2");    }    int a=100;    static int b=112;}

我們先來看一下各個變數在類載入的時候的初始化順序:
1、初始化父類的靜態變數,靜態代碼塊,初始化的順序按照出現順序。
2、初始化子類的靜態變數,靜態代碼塊。
3、初始化父類的成員變數。
4、執行父類的建構函式。
5、初始化子類的成員變數。
6、構造代碼塊建立對象時執行。
7、執行子類的建構函式。
執行的結果為:
2
3
a=100,b=0
1
4
產生這個結果的原因的關鍵在這一句話:
static StaticTest st = new StaticTest();
st變數的引用是本類的執行個體,因此在執行個體化st變數時,將執行個體初始化嵌入到靜態初始化中。因為這一句放在靜態初始化的開頭,所以static int b=112沒有被調用,輸出的b=0,同時,輸出1也在2和3後面。在對象的初始化時,也是先初始化環境變數,再執行建構函式,a的值為100。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.