由一道面試題來看Java的類加載順序

請寫出語句的執行結果:<br>code

HelloA.class<br>對象

public class HelloA {

    public HelloA() {
        System.out.println("HelloA");
    }

    {
        System.out.println("I am HelloA class");
    }

    static {
        System.out.println("static HelloA");
    }
}

HelloB.class<br>虛擬機

public class HelloB extends HelloA {

    public HelloB() {
        System.out.println("HelloB");
    }
    {
        System.out.println("I am Hello B class");
    }
    static {
        System.out.println("static HelloB");
    }

    public static void main(String[] args){

        System.out.println("----------main start ---------");

        new HelloB();
        new HelloB();

        System.out.println("----------main end ------------");

    }
}

運行結果:<br>class

static HelloA
static HelloB
----------main start ---------
I am HelloA class
HelloA
I am Hello B class
HelloB
I am HelloA class
HelloA
I am Hello B class
HelloB
----------main end ------------

解析:<br> Java 類在虛擬機中初始化的順序爲:<br>變量

  1. 類被虛擬機加載後從父類到子類執行被static修飾的語句(題目中先執行HelloA中的靜態代碼塊,而後執行HelloB中的靜態代碼塊),由於static修飾的變量、方法和代碼塊是和類相關的,在類加載的時候就要進行初始化,與對象無關。<br>
  2. static語句執行完畢後再執行main方法。
  3. 使用new建立對象的時候先要執行父類的代碼塊、構造方法,再執行子類的構造方法和代碼塊。
相關文章
相關標籤/搜索