轉自http://blog.csdn.net/monghuan/article/details/7404670
一個類可以使用不包含在任何方法體中的靜態代碼塊,當類被載入時,靜態代碼塊被執行,且只被執行一次,靜態塊常用來執行類屬性的初始化。
一.類加載時,變量的初始化順序:
1.首先,給靜態成員變量分配內存空間,進行默認初始化
(整型為0,浮點型為0.0,布爾型為false,字符型為'\u0000',引用型為null)
2.其次,執行靜態成員變量的初始化操作
--靜態成員的初始化,包括兩種: 聲明時直接初始化和靜態代碼塊
--執行順序為:在代碼中的出現的順序(聲明的順序)
注意: 1和2的動作,在類加載時只執行一次!!!!!!!
如果創建了對象,則在堆中給類的實例分配內存空間,
3.首先,對實例變量,進行默認初始化
(整型為0,浮點型為0.0,布爾型為false,字符型為'\u0000',引用型為null)
4.其次,執行實例變量的初始化操作
--實例變量的初始化,使用前2種初始化方式: 聲明時直接初始化和代碼塊
--執行順序為:在代碼中的出現的順序(聲明的順序)
5.最后,執行構造函數(實例變量的第3中初始化方式)
二.繼承時,變量的初始化順序:
1.當類第一次使用時,JVM就會加載該類,如果該類存在父類,那么就先加載父類,這是一個遞歸過程,直到Object為止.
在類加載中,首先進行靜態成員變量按照默認值進行初始化,
然后按照在類中聲明的順序執行靜態代碼塊和靜態變量的顯示初始化.
這個過程從父類到子類,並且只會執行一次!!!
2.當父類與子類的靜態代碼初始化完成后,如果創建了類的對象,
在初始化子類前,會先對其父類的實例變量進行默認初始化,
然后按照在類中的聲明順序來執行代碼塊與實例變量的顯示初始化,
最后調用父類的構造函數,這也是一個遞歸過程,直到Object類為止.
(這個過程在每次創建對象時,都會執行!!!)