1. 程式人生 > >java 繼承中程式碼執行順序(個人見解)

java 繼承中程式碼執行順序(個人見解)

面試題

以下程式碼執行結果

public class Test {
    class Super{
        int flag=1;
        Super(){
            test();
        }  void test(){
            System.out.println("Super.test() flag="+flag);
        }
    }
    class Sub extends Super{
        Sub(int i){
            flag=i;
            System.out.println("Sub.Sub()flag="+flag);
        }  void test(){
            System.out.println("Sub.test()flag="+flag);
        }
    }
    public static void main(String[] args) {  new Test().new Sub(5);
    }
}

結果:

Sub.test()flag=1
Sub.Sub()flag=5

解析

1.繼承中程式碼執行順序

1.父類靜態物件,父類靜態程式碼塊
2.子類靜態物件,子類靜態程式碼塊
3.父類非靜態物件,父類非靜態程式碼塊
4.父類建構函式
5.子類非靜態物件,子類非靜態程式碼塊
6.子類建構函式

2.java多型的實現

  • 繼承:在多型中必須存在有繼承關係的子類和父類。
  • 重寫:子類對父類中某些方法進行重新定義,在呼叫這些方法時就會呼叫子類的方法。
  • 向上轉型:在多型中需要將子類的引用賦給父類物件,只有這樣該引用才能夠具備技能呼叫父類的方法和子類的方法。

而這裡的test方法就是重寫。

3.分析程式碼

在執行new Test().new Sub(5);之前,先建立變數flag = 1,然後呼叫父類的構造方法,父類的構造方法中呼叫了test,由於java多型的實現。會呼叫子類重寫的test而不是父類test,所以第一句列印的是:Sub.test()flag=1,接著呼叫子類的構造方法,子類中將5賦給父類的成員變數flag,接著列印:Sub.Sub()flag=5。

結論

  • 繼承中程式碼執行順序如上
  • java中子類對父類中某些方法進行重新定義,在呼叫這些方法時就會呼叫子類的方法。