原創:轉載需注明原創地址 https://www.cnblogs.com/fanerwei222/p/11451040.html
版本:Java8
直接上代碼:
public class StaticMain { public static int i = 200; { i = 100; } public static void main(String[] args){ System.out.println(i); } }
結果:
繼續上代碼:
public class StaticMain { { i = 100; } public static int i = 200; public static void main(String[] args){ System.out.println(i); } }
結果:
繼續上代碼:
public class StaticMain { { i = 100; System.out.println(i + " : static"); } public static int i = 200; public static void main(String[] args){ System.out.println(i + " : main"); } }
結果:
繼續上代碼:
public class StaticMain { public static int i = 200; { i = 100; System.out.println(i + " : static"); } public static void main(String[] args){ System.out.println(i + " : main"); } }
結果:
繼續上代碼:
public class StaticMain { public static int i; { i = 100; System.out.println(i + " : static"); } public static void main(String[] args){ System.out.println(i + " : main"); } }
結果:
繼續上代碼:
public class StaticMain { public static int i; { i = 100; System.out.println(StaticMain.i + " : static"); } public static void main(String[] args){ System.out.println(StaticMain.i + " : main"); } }
結果:
接下來改變一下:
繼續上代碼:
public class StaticMain { public static int i; { i = 100; System.out.println(StaticMain.i + " : static"); } public static void main(String[] args){ StaticMain staticMain = new StaticMain(); System.out.println(StaticMain.i + " : main"); } }
結果:
繼續上代碼:
public class StaticMain { public static int i = 200; { i = 100; System.out.println(StaticMain.i + " : static"); } public static void main(String[] args){ StaticMain staticMain = new StaticMain(); System.out.println(StaticMain.i + " : main"); } }
結果:
繼續上代碼:
public class StaticMain { { i = 100; System.out.println(StaticMain.i + " : static"); } public static int i = 200; public static void main(String[] args){ StaticMain staticMain = new StaticMain(); System.out.println(StaticMain.i + " : main"); } }
結果:
結論: 靜態塊中的變量是先拿到定義再在后續拿到實際變量之后再進行后續對變量的操作的; 如果不初始化靜態塊所屬類,靜態塊將不會因為他的所屬類的調用而被加載.
附:類初始化時的順序:
1、類內容(靜態變量、靜態初始化塊) => 實例內容(變量、初始化塊、構造器)
2、父類的(靜態變量、靜態初始化塊)=> 子類的(靜態變量、靜態初始化塊)=> 父類的(變量、初始化塊、構造器)=> 子類的(變量、初始化塊、構造器)
結束🔚