對於Java初學者來說,關於靜態變量、非靜態變量的初始化時機與順序,以及構造函數的執行時機與順序都會感覺有點理不清頭緒,下面文章使用實例程序幫大家解決這方面的疑惑。雖然簡單,但是對Java入門者來說還是有一定的幫助作用。
預備知識:
- 代碼等價於:
- 代碼 等價於:
- static塊中的初始化代碼按其在源代碼中的位置順序執行。
以上內容大家可以參考文章:http://hi.baidu.com/suofang/blog/item/362d4ea77fa5c099d14358cf.html
接下來我們對靜態變量初始化、非靜態變量初始化及構造函數的執行時機與執行順序進行分析,首先我們編寫了一個類,代碼如下:
在這段代碼中,包括了靜態變量與非靜態變量的初始化代碼,還有構造函數,爲了驗證這些代碼的執行時機與執行順序,我們進行了如下實驗:
- 在主類中使用Zz類的靜態變量,代碼如下:顯示結果:
- 在主類中調用Zz類的靜態函數,代碼如下:顯示結果:
- 在主類中聲明Zz類變量,但不實例化,代碼如下:顯示結果:無任何內容。
- 在主類中聲明Zz類變量,並實例化,代碼如下:顯示結果:
結論:
- 僅僅在代碼中申明瞭一個類變量,並不會執行該類的任何變量初始化代碼,更不用說構造函數。
- 在代碼中申明瞭一個類變量,並實例化,則依次執行該類的如下代碼:靜態變量初始化代碼->非靜態變量初始化代碼->構造函數代碼。
- 在代碼中使用或者調用了一個類的靜態成員(包括靜態變量與靜態函數),則會觸發執行該類的靜態變量初始化代碼,但不會執行構造函數代碼。