package test;
class Parent{
static String name = "hello";
{
System.out.println("3 parent block");
}
static {
System.out.println("1 parent static block");
}
public Parent(){
System.out.println("4 parent constructor");
}
}
class Child extends Parent{
static String childName = "hello";
{
System.out.println("5 child block");
}
static {
System.out.println("2 child static block");
}
public Child(){
System.out.println("6 child constructor");
}
}
public class StaticIniBlockOrderTest {
public static void main(String[] args) {
new Child();//語句(*)
}
}
分析:對象的初始化順序:首先執行父類靜態的內容,父類靜態的內容執行完畢後,接着去執行子類的靜態的內容,當子類的靜態內容執行完畢之後,再去看父類有沒有非靜態代碼塊,如果有就執行父類的非靜態代碼塊,父類的非靜態代碼塊執行完畢,接着執行父類的構造方法;父類的構造方法執行完畢之後,它接着去看子類有沒有非靜態代碼塊,如果有就執行子類的非靜態代碼塊。子類的非靜態代碼塊執行完畢再去執行子類的構造方法。總之一句話,靜態代碼塊內容先執行,接着執行父類非靜態代碼塊和構造方法,然後執行子類非靜態代碼塊和構造方法。而且子類的構造方法,不管這個構造方法帶不帶參數,默認的它都會先去尋找父類的不帶參數的構造方法。如果父類沒有不帶參數的構造方法,那麼子類必須用supper關鍵子來調用父類帶參數的構造方法,否則編譯不能通過。
本文轉自:http://blog.csdn.net/edward_qing_lee/article/details/8067492