類加載面試題分析

題目

下列兩個程序打印出的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;
發佈了21 篇原創文章 · 獲贊 13 · 訪問量 8179
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章