1. 程式人生 > >【JAVA基礎】java繼承鏈中方法呼叫優先順序.順序:this.show(object)>super.show(object)>this.show((super)object)>super.show(

【JAVA基礎】java繼承鏈中方法呼叫優先順序.順序:this.show(object)>super.show(object)>this.show((super)object)>super.show(

先上程式碼:

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