1. 初始化塊
初始化塊通常寫在類的構造方法之前,由花括號括起來,通常包含對成員屬性進行初始化的語句;
初始化塊分為instance初始化塊和static初始化塊,初始化塊在構造方法執行之前被執行;
static初始化塊不能訪問非statci成員,也不能調用非static方法,並且只在類加載時執行一次;
初始化塊通常用於提取多個構造方法中的公共代碼。
2. 初始化的執行順序
(1)在初次new一個Child類對象時,發現其有父類,則先加載Parent類,再加載Child類。
(2)加載Parent類:
初始化Parent類的static屬性,賦默認值;
執行Parent類的static初始化塊;
(3)加載Child類:
初始化Child類的static屬性,賦默認值;
執行Child類的static初始化塊;
(4)創建Parent類對象:
初始化Parent類的非static屬性,賦默認值;
執行Parent類的instance初始化塊;
執行Parent類的構造方法;
(5)創建Child類對象:
初始化Child類的非static屬性,賦默認值;
執行Child類的instance初始化塊;
執行Child類的構造方法;
后面再創建Child類對象時,就按照順序執行(4)(5)兩步。
class Parent { private static int ps; private int pv; static { System.out.println("parent static init block"); } { System.out.println("parent init block"); } Parent() { System.out.println("parent constructor"); } } class Child extends Parent { private static int cs; private int cv; static { System.out.println("child static init block"); } { System.out.println("child init block"); } Child() { System.out.println("child constructor"); } } public class Test { public static void main(String[] args) { new Child(); new Child(); } }
執行結果是:
parent static init block
child static init block
parent init block
parent constructor
child init block
child constructor
parent init block
parent constructor
child init block
child constructor
參考資料 《Java核心技術》