討論code 大多數人會認為如果main之后,肯定是先打印出靜態代碼塊內容
如果你也這樣認為就錯了
要知道當main運行之后
- A. 加載字節碼到內存(從上到下加載,此時為加載完整,因為因為靜態n還未加載)
- B. 從上到下加載靜態方法加載 k->Test t1
當發現Test是要實例的時候執行順序是:非靜態成員變量->非靜態代碼塊->構造
實例化順序:加載 a j
1:j i=0 n=0 因為k已經加載了所以是0,++k 是先賦值所以就是1[非靜態成員變量]
2:代碼塊 i=1 n=1 [非靜態代碼塊]
構造器:3:t1 i= n=2[構造]
C.加載Test t2, 重復上面步驟456
4:j i=3 n=3
5:代碼塊 i=4 n=4
構造器:6:t2 i= n=5D.此時加載靜態i
7:1 i=6 n=6
E.開始加載最后一個靜態變量n=99后開始加載靜態代碼塊
1:靜態代碼塊 i=7 n=99F. 到此字節碼加載完成到內存
那么我們如何證明是這樣呢?我們來做一個減法!
我們先把需要實例化的靜態的成員變量注釋掉,然后運行,不出意外的話,只加載了字節碼到內存
應該只加載了靜態成員變量->靜態代碼塊->靜態方法
總結:
字節碼加載 : 靜態成員變量->靜態代碼塊->靜態方法
類實例化 : 非靜態成員變量->非靜態代碼塊->構造
在本案例中:
字節碼加載包含了類實例化,所以導致了靜態代碼塊,要等到兩個實例化之后最后執行,也就是我們所想的先加載靜態代碼塊,變成了最后才執行