【JAVA基礎】java繼承鏈中方法呼叫優先順序.順序:this.show(object)>super.show(object)>this.show((super)object)>super.show(
阿新 • • 發佈:2018-12-24
先上程式碼:
public class ExtendsTest { public static void main(String args[]){ A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); System.out.println(a1.show(c)); System.out.println(a2.show(c)); System.out.println(a2.show(b)); } } class A{ public String show(A obj){ return "A and A"; } public String show(C obj){ return "A and C"; } } class B extends A{ public String show(B obj){ return "B and B"; } public String show(C obj){ return "B and C"; } } class C extends B{ }
結果:
分析:
在上述程式碼中,類B繼承了類A,類C繼承了類B,A中show()方法發生了過載,B中重寫了A中的show(C )方法。
第一條輸出語句是 父類引用a1 指向 父類例項物件,編譯時檢視A類中是否有show(c)的方法,有,通過,執行,輸出A and C;
第二條輸出語句是 父類引用a2 指向 子類例項物件,因為子類B重寫了父類的show(c)方法,所以向上造型(父類引用指向子類物件)時,父類A型引用變數可以點出子類B中的show(c)方法,編譯通過,執行時呼叫子類B中的show(C)方法,結果為B and C;
第三條輸出語句是 父類引用變數a2 指向 子類例項物件,根據優先順序順序,先看第一個級別this.show(object),因為向上造型,所以父類引用a2點不出子類B中的show(b)方法,編譯不行;再看第二個級別super.show(object),父類A中也沒有show(b)方法,編譯不通過;然後再看第三個級別this.show(super(object)),此時a2.show(b)就變成了a2.show(a),B 因為繼承了A類,所以B中有show(a)的方法,編譯通過,到執行期,根據物件型別呼叫方法,輸出結果就是A and A。
原文:https://blog.csdn.net/qq_33556244/article/details/77112997