定義一個父類Test
public class Test {
static int age = 10; // 靜態變數age
static {
System.out.println("Test靜態代碼塊");
}
{
System.out.println("Test普通代碼塊");
}
public static void exam() {
System.out.println("Test靜態方法");
}
public Test() {
System.out.println("Test無參構造方法");
}
}
定義一個子類Demo
public class Demo extends Test {
static {
System.out.println("Demo靜態代碼塊");
}
{
System.out.println("Demo普通代碼塊");
}
public Demo() {
System.out.println("Demo無參構造");
}
public static void main(String[] args) {
Test.exam();
new Demo();
System.out.println(Test.age);
}
}
首先當類加載的時候,會自動加載靜態代碼塊,靜態的都是和類一起加載的,并且靜態變數和靜態方法是根據呼叫順序來執行的,
當我們運行Demo類時,結果會是什么呢?
首先當虛擬機加載Demo類時,他會自動加載靜態代碼塊,因為Demo繼承了Test類,它會先去找Test類當中有沒有靜態代碼塊,如果有,則按順序運行父類中的靜態代碼塊,如果執行完或沒有,則運行當前類的靜態方法,故會依次輸出 Test靜態方法–>Demo靜態方法兩個結果,然后執行new Demo(); 在執行子類的實體化之前,虛擬機又會去父類找普通代碼塊,如果有則執行,沒有則會去呼叫父類的構造方法,隨后去呼叫子類的普通代碼塊,然后才去執行子類的構造方法,所以會依次輸出:Test普通代碼塊–>Test無參構造方法–>Demo普通代碼塊–>Demo無參構造.,隨后執行**System.out.println(“Test.age”);**陳述句,輸出10,故程式的輸出結果如下圖所示:

總結
當加載Demo類時,JVM會去呼叫該類父類的靜態代碼塊,父類的靜態代碼塊運行完后去執行子類的靜態代碼塊,當子類的靜態代碼塊執行完畢后JVM又會去找父類中的普通代碼塊,當父類的普通代碼塊執行完畢后又會呼叫父類的構造方法,父類的構造方法執行完畢后,JVM又會去看子類中有沒有普通代碼塊,如果有則執行,執行完畢后,會去呼叫子類的構造方法,這就是他們之間的順序,
注意:java中所有類都是Object類的子類,當父類中含有有參構造而沒有顯示的寫出無參構造,則子類必須用super關鍵字顯示的呼叫父類的有參構造,否則編譯將不通過,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/229327.html
標籤:其他
上一篇:挑戰一道Java基礎的面試題
