Java面試題 靜态變量 靜态代碼塊 代碼塊
package statict;
public class StaticTest {
public static StaticTest s1 = new StaticTest();
public static StaticTest s2 = new StaticTest();
{
System.out.println("code");
}
static{
System.out.println("static");
}
public static void main(String[] args) {
new StaticTest();
}
}
執行結果:
code
code
static
code
解析:
靜态代碼塊在執行過程中是可以使用靜态變量的。
在.class檔案編譯階段,靜态變量和靜态代碼塊會按照語句出現的順序拼接成一個類初始化方法,這個方法的執行也将完成靜态變量的初始化和靜态代碼塊的執行,是以會首先執行初始化對象s1,s2,執行普通代碼塊,輸出code.。s1,s2初始化完成以後執行靜态代碼塊代碼,輸出static。最後的code也是非靜态代碼塊中輸出的。
在以往的認知中,總認為靜态代碼塊在類加載的時候首先執行,而忽略了靜态變量的初始化是可能執行在靜态代碼塊前面的。