♦ 當java創建一個對象時,先為該對象的所以實例變數分配棧記憶體(已載入類的前提),然後執行實例變數的初始化,其初始化順序是,先執行初始化塊 或 聲明實例變數時的初始值(具體執行順序根據源碼實際的排序順序而定),然後再執行構造器聲明的初始值。 ♦ 靜態初始化塊類似,jvm第一次主動使用某個類時,會在 ...
♦ 當java創建一個對象時,先為該對象的所以實例變數分配棧記憶體(已載入類的前提),然後執行實例變數的初始化,其初始化順序是,先執行初始化塊 或 聲明實例變數時的初始值(具體執行順序根據源碼實際的排序順序而定),然後再執行構造器聲明的初始值。
1 public class InitTest { 2 int a=3; 3 { 4 a=1; 5 } 6 InitTest(){ 7 a=2; 8 } 9 public static void main(String[] args) { 10 InitTest it = new InitTest(); 11 //輸出2,因為構造器再次指定初始值 12 System.out.println(it.a); 13 } 14 }
1 public class InitTest { 2 //代碼1 3 { 4 a=1; 5 } 6 //代碼2 7 int a=3; 8 9 public static void main(String[] args) { 10 InitTest it = new InitTest(); 11 //輸出3,因為實例變數再次指定初始值。若代碼1和代碼2對調位置,則輸出1 12 System.out.println(it.a); 13 } 14 }
♦ 靜態初始化塊類似,jvm第一次主動使用某個類時,會在類準備階段為該類的靜態成員變數分配記憶體,在初始化階段初始化這些成員變數,初始化執行的順序和源碼的排序相同。
1 public class InitTest { 2 //1 3 static{ 4 a=1; 5 } 6 //2 7 public static int a=3; 8 9 public static void main(String[] args) { 10 //輸出3,因為實例變數再次指定初始值。若1和2對調位置,則輸出1 11 System.out.println(InitTest.a); 12 } 13 }
--內容參考《瘋狂java》