在網上看了一個這樣的題目
public class StaticTest {
public static void main(String[] args) {
staticFunction();
}
static StaticTest st = new StaticTest();
static {
System.out.println("1");
}
{
System.out.println("2");
}
StaticTest() {
System.out.println("3");
System.out.println("a=" + a + ",b=" + b);
}
public static void staticFunction() {
System.out.println("4");
}
int a = 110;
static int b = 112;
}
問輸出順序是什麼?
正确答案是:
2
3
a=110,b=0
1
4
産生這個結果的原因的關鍵在這一句話:
static StaticTest st = new StaticTest();
st變量的引用是本類的執行個體,是以在執行個體化st變量時,将執行個體初始化嵌入到靜态初始化中。因為這一句放在靜态初始化的開頭,是以static int b=112沒有被調用,輸出的b=0,同時,輸出1也在2和3後面。在對象的初始化時,也是先初始化環境變量,再執行構造函數,a的值為100。
後面我在想把static int b = 112放到st之前會發生什麼
public class StaticTest {
public static void main(String[] args) {
staticFunction();
}
static int b = 112;
static StaticTest st = new StaticTest();
static {
System.out.println("1");
}
{
System.out.println("2");
}
StaticTest() {
System.out.println("3");
System.out.println("a=" + a + ",b=" + b);
}
public static void staticFunction() {
System.out.println("4");
}
int a = 110;
}
執行結果:
2
3
a=110,b=112
1
4
b有值了。是以b在st聲明前指派,st執行個體化的時候b就有值了。說明靜态變量之間執行個體化是按代碼順序執行的。
如果把靜态代碼塊,提到st之前會發生什麼呢?
public class StaticTest {
public static void main(String[] args) {
staticFunction();
}
static {
System.out.println("1");
}
static StaticTest st = new StaticTest();
{
System.out.println("2");
}
StaticTest() {
System.out.println("3");
System.out.println("a=" + a + ",b=" + b);
}
public static void staticFunction() {
System.out.println("4");
}
int a = 110;
static int b = 112;
}
1
2
3
a=110,b=0
4
發現執行順序變了,它會先執行靜态代碼塊,再執行st的實體化。
這邊,我發現靜态代碼塊與靜态成員變量的初始化居然和代碼順序有關
是以不管是靜态代碼塊還是靜态成員變量,java都是哪個在前面先執行哪個。
如果我的文章對你有幫助,就點一下推薦吧.(*^__^*)