Java常見(jiàn)筆試面試題目解析(三): Java中的靜態(tài)變量的執(zhí)行順序
public class StaticVariableTest {
private static StaticVariableTest svt = new StaticVariableTest();//語(yǔ)句(1)
private static int count1;//語(yǔ)句(2)
private static int count2 = 0;//語(yǔ)句(3)
private StaticVariableTest(){//語(yǔ)句(4)
count1++;
count2++;
}
public static StaticVariableTest getInstance(){//語(yǔ)句(5)
return svt;
}
public static int getCount1() {
return count1;
}
public static void setCount1(int count1) {
StaticVariableTest.count1 = count1;
}
public static int getCount2() {
return count2;
}
public static void setCount2(int count2) {
StaticVariableTest.count2 = count2;
}
public static void main(String[] args) {
StaticVariableTest svt = StaticVariableTest.getInstance();//語(yǔ)句(6)
System.out.println("count1:" + svt.getCount1());//語(yǔ)句(7)
System.out.println("count1:" + svt.getCount2());//語(yǔ)句(8)
}
}
問(wèn)題:當(dāng)執(zhí)行完語(yǔ)句(7)(8)時(shí),打印結(jié)果分別是什么?為什么?
解答:當(dāng)執(zhí)行完語(yǔ)句(7)時(shí),打印結(jié)果是1,當(dāng)執(zhí)行完語(yǔ)句(8)時(shí),打印結(jié)果是0。分析:程序執(zhí)行從main方法開(kāi)始,首先執(zhí)行語(yǔ)句(6),調(diào)用 getInstance方法,然而當(dāng)它去調(diào)用這個(gè)方法的時(shí)候,它是一個(gè)靜態(tài)的方法,在這個(gè)類里面定義了多個(gè)靜態(tài)的成員變量。根據(jù)java初始化的順序我們 知道,對(duì)于靜態(tài)的內(nèi)容肯定是先執(zhí)行的,也就是說(shuō)在執(zhí)行g(shù)etInstance方法之前,肯定先執(zhí)行private static StaticVariableTest svt = new StaticVariableTest();而且它是從上到下分別執(zhí)行靜態(tài)的內(nèi)容。換句話說(shuō),這個(gè)程序首先執(zhí)行private static StaticVariableTest svt = new StaticVariableTest();而這里面又要調(diào)用一個(gè)構(gòu)造方法StaticVariableTest(),則去執(zhí)行這個(gè)構(gòu)造方法 private StaticVariableTest(),執(zhí)行這個(gè)構(gòu)造方法時(shí)發(fā)現(xiàn)它里面的功能是將count1加1,將count2加1,而這個(gè)count1和 count2是我們定義的int類型的靜態(tài)變量。根據(jù)java對(duì)成員變量的默認(rèn)值,count1和count2初始化的時(shí)候都被設(shè)置為0,當(dāng)執(zhí)行完構(gòu)造方 法后count1和 count2都等于1,這時(shí)StaticVariableTest這個(gè)對(duì)象就生成了,已經(jīng)在內(nèi)存里面存在了。接著賦給svt這個(gè)引用。那么svt這個(gè)引用 指向的StaticVariableTest類型的對(duì)象,它里面的count1是1,count2也是1。接著發(fā)現(xiàn)下面一行private static int count1;它是一個(gè)靜態(tài)的,那么它要執(zhí)行這行代碼,這行代碼只是一個(gè)聲明,但是沒(méi)有賦值,接著它就跳過(guò)這行不再賦值了(究其原因是因?yàn)閏ount1已 經(jīng)被賦值了,已經(jīng)被加1了,也就是count1為1)。當(dāng)我執(zhí)行private static int count2 = 0;時(shí)發(fā)現(xiàn)count2也是一個(gè)靜態(tài)變量,而且有一個(gè)顯示的去賦值的這樣一個(gè)動(dòng)作。我們知道count2已經(jīng)被賦值1了,但是這兒有一個(gè)顯示的賦值的動(dòng) 作,就把count2的值由1改變成了0。這個(gè)就是調(diào)用getInstance方法時(shí)程序的執(zhí)行流程:語(yǔ)句(6)、語(yǔ)句(5)、語(yǔ)句(1)、語(yǔ)句(4)、 語(yǔ)句(2)、語(yǔ)句(3)
思考:如果將語(yǔ)句(2)和語(yǔ)句(3)放在語(yǔ)句(1)前面,當(dāng)執(zhí)行完語(yǔ)句(7)時(shí),打印結(jié)果是1,當(dāng)執(zhí)行完語(yǔ)句(8)時(shí),打印結(jié)果是1,想想是為什么?
總結(jié):靜態(tài)變量的執(zhí)行順序是按照它們定義在類里面的先后順序,按照從上到下來(lái)執(zhí)行的。
private static StaticVariableTest svt = new StaticVariableTest();//語(yǔ)句(1)
private static int count1;//語(yǔ)句(2)
private static int count2 = 0;//語(yǔ)句(3)
private StaticVariableTest(){//語(yǔ)句(4)
count1++;
count2++;
}
public static StaticVariableTest getInstance(){//語(yǔ)句(5)
return svt;
}
public static int getCount1() {
return count1;
}
public static void setCount1(int count1) {
StaticVariableTest.count1 = count1;
}
public static int getCount2() {
return count2;
}
public static void setCount2(int count2) {
StaticVariableTest.count2 = count2;
}
public static void main(String[] args) {
StaticVariableTest svt = StaticVariableTest.getInstance();//語(yǔ)句(6)
System.out.println("count1:" + svt.getCount1());//語(yǔ)句(7)
System.out.println("count1:" + svt.getCount2());//語(yǔ)句(8)
}
}
問(wèn)題:當(dāng)執(zhí)行完語(yǔ)句(7)(8)時(shí),打印結(jié)果分別是什么?為什么?
解答:當(dāng)執(zhí)行完語(yǔ)句(7)時(shí),打印結(jié)果是1,當(dāng)執(zhí)行完語(yǔ)句(8)時(shí),打印結(jié)果是0。分析:程序執(zhí)行從main方法開(kāi)始,首先執(zhí)行語(yǔ)句(6),調(diào)用 getInstance方法,然而當(dāng)它去調(diào)用這個(gè)方法的時(shí)候,它是一個(gè)靜態(tài)的方法,在這個(gè)類里面定義了多個(gè)靜態(tài)的成員變量。根據(jù)java初始化的順序我們 知道,對(duì)于靜態(tài)的內(nèi)容肯定是先執(zhí)行的,也就是說(shuō)在執(zhí)行g(shù)etInstance方法之前,肯定先執(zhí)行private static StaticVariableTest svt = new StaticVariableTest();而且它是從上到下分別執(zhí)行靜態(tài)的內(nèi)容。換句話說(shuō),這個(gè)程序首先執(zhí)行private static StaticVariableTest svt = new StaticVariableTest();而這里面又要調(diào)用一個(gè)構(gòu)造方法StaticVariableTest(),則去執(zhí)行這個(gè)構(gòu)造方法 private StaticVariableTest(),執(zhí)行這個(gè)構(gòu)造方法時(shí)發(fā)現(xiàn)它里面的功能是將count1加1,將count2加1,而這個(gè)count1和 count2是我們定義的int類型的靜態(tài)變量。根據(jù)java對(duì)成員變量的默認(rèn)值,count1和count2初始化的時(shí)候都被設(shè)置為0,當(dāng)執(zhí)行完構(gòu)造方 法后count1和 count2都等于1,這時(shí)StaticVariableTest這個(gè)對(duì)象就生成了,已經(jīng)在內(nèi)存里面存在了。接著賦給svt這個(gè)引用。那么svt這個(gè)引用 指向的StaticVariableTest類型的對(duì)象,它里面的count1是1,count2也是1。接著發(fā)現(xiàn)下面一行private static int count1;它是一個(gè)靜態(tài)的,那么它要執(zhí)行這行代碼,這行代碼只是一個(gè)聲明,但是沒(méi)有賦值,接著它就跳過(guò)這行不再賦值了(究其原因是因?yàn)閏ount1已 經(jīng)被賦值了,已經(jīng)被加1了,也就是count1為1)。當(dāng)我執(zhí)行private static int count2 = 0;時(shí)發(fā)現(xiàn)count2也是一個(gè)靜態(tài)變量,而且有一個(gè)顯示的去賦值的這樣一個(gè)動(dòng)作。我們知道count2已經(jīng)被賦值1了,但是這兒有一個(gè)顯示的賦值的動(dòng) 作,就把count2的值由1改變成了0。這個(gè)就是調(diào)用getInstance方法時(shí)程序的執(zhí)行流程:語(yǔ)句(6)、語(yǔ)句(5)、語(yǔ)句(1)、語(yǔ)句(4)、 語(yǔ)句(2)、語(yǔ)句(3)
思考:如果將語(yǔ)句(2)和語(yǔ)句(3)放在語(yǔ)句(1)前面,當(dāng)執(zhí)行完語(yǔ)句(7)時(shí),打印結(jié)果是1,當(dāng)執(zhí)行完語(yǔ)句(8)時(shí),打印結(jié)果是1,想想是為什么?
總結(jié):靜態(tài)變量的執(zhí)行順序是按照它們定義在類里面的先后順序,按照從上到下來(lái)執(zhí)行的。
posted on 2009-02-28 10:57 草原上的駱駝 閱讀(717) 評(píng)論(0) 編輯 收藏 所屬分類: 其它