java 繼承中程式碼執行順序(個人見解)
阿新 • • 發佈:2018-12-21
面試題
以下程式碼執行結果
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中子類對父類中某些方法進行重新定義,在呼叫這些方法時就會呼叫子類的方法。