下面程序的運行結果是什么()
class HelloA {
public HelloA() {
System.out.println("HelloA");
}
{ System.out.println("I'm A class"); }
static { System.out.println("static A"); }
}
public class HelloB extends HelloA {
public HelloB() {
System.out.println("HelloB");
}
{ System.out.println("I'm B class"); }
static { System.out.println("static B"); }
public static void main(String[] args) {
new HelloB();
}
}
答案:
static A static B I'm A class HelloA I'm B class HelloB
解析:考查靜態語句塊、構造語句塊(就是只有大括號的那塊)以及構造函數的執行順序。
對象的初始化順序:(1)類加載之后,按從上到下(從父類到子類)執行被static修飾的語句;(2)當static語句執行完之后,再執行main方法;(3)如果有語句new了自身的對象,將從上到下執行構造代碼塊、構造器(兩者可以說綁定在一起)。
下面稍微修改下上面的代碼,以便更清晰的說明情況:
View Code
此時輸出結果為:
static A static B -------main start------- I'm A class HelloA I'm B class HelloB I'm A class HelloA I'm B class HelloB -------main end-------

