類載入建立屬性賦值順序
阿新 • • 發佈:2021-07-18
定義一個類,往往會直接賦值,或者用程式碼塊(static {} 和 {} )的形式,需要搞清楚賦值的順序,才能知道欄位到底對應什麼值
例如有這麼一個類
public class Student { static { System.out.println("static 塊執行開始~~~"); } static { phone = "51227722"; } { name = "建宇"; age = 18; } { name = "小宇"; age = 25; } private String name = "小趙"; private int age = 8; private static String phone = "0056"; static { System.out.println("static 塊執行中~~~"); System.out.println(phone); } { System.out.println("name = " + name); System.out.println("age = " + age); } static { phone = "9759"; } static { System.out.println("static 塊執行結束~~~"); System.out.println(phone); } { name = "最後賦值"; age = -1; } { System.out.println("name = " + name); System.out.println("age = " + age); } }
經過網上查閱資料,以及我自己做實驗,可以得到結論執行順序結論:
- 父類靜態域
- 子類靜態域
- 父類的普通域
- 父類建構函式
- 子類的普通域
- 子類的建構函式
其中,靜態域分為static程式碼塊和static屬性定義時賦值,這兩個賦值,值取在下面,也即是行號大的(也可以說靜態域是順序執行,最後執行的肯定就把之前執行的覆蓋咯)
普通域,也分為{}程式碼塊和屬性定義時賦值,和靜態域的執行流程一樣
最後,需要注意static屬性是類載入時賦值的,而普通欄位是new物件執行的,static屬性和static {} 只在類第一次載入時執行,普通域每次new物件時都執行