題目
下列兩個程序打印出的a、b值分別是多少?
- 程序1
class Blog {
private static int a;
private static int b = 0;
private static Blog blog = new Blog();
private Blog() {
a++;
b++;
}
public static void main(String[] args) {
System.out.println(a);
System.out.println(b);
}
}
- 程序2
class Blog1 {
private static Blog1 blog = new Blog1();
private static int a;
private static int b = 0;
private Blog1() {
a++;
b++;
}
public static void main(String[] args) {
System.out.println(a);
System.out.println(b);
}
}
類加載原理分析
- 在準備階段,會給所有靜態變量賦上初始值,例如int類型初始值爲0,對象類型初始值爲null;
- 在初始化階段,所有靜態變量,靜態代碼塊按照它們在源代碼中出現的先後順序,依次執行賦值語句;
- 在靜態變量被定義之前,可以先對其執行賦值操作,但是不能對其執行讀取操作;
題目解析
- Blog類在準備階段,會給變量a、b賦值0,給blog賦值null。在初始化階段,會按照靜態變量賦值語句的先後順序,依次執行;
- 程序1中,先執行語句b=0,執行結束a=0,b=0。 再執行語句blog = new Blog(),調用了構造方法,執行兩條語句a++,b++,執行結束a=1,b=1。最終程序1打印結果爲a=1,b=1;
- 程序2中,先執行語句blog = new Blog(),調用了構造方法,執行兩條語句a++,b++,執行結束a=1,b=1。再執行語句b=0,執行結束a=1,b=0。最終程序2打印結果爲a=1,b=0;