1. 程式人生 > >A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C();

A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C();

public class A {
	//方法過載
	public String show(D obj) {
		return "A&D";
	}
	public String show(A obj) {
		return "A&A";
	}

}
public class B extends A {
	public String show(B obj) {
		return "B&B";
	}

	public String show(A obj) {
		return "B&A";
	}

}

public class C extends B{

}

public class D extends B{

}
<pre name="code" class="java">public class MainDemo {
	public static void main(String[] args) {
		A a1 = new A();  
        A a2 = new B();  
        B b = new B();  
        C c = new C();   
        D d = new D();  
        
        System.out.println(a1.show(b));  //1
        System.out.println(a1.show(c));
        System.out.println(a1.show(d));  //3
        System.out.println(a2.show(a1)); //B中方法A引數型別
        System.out.println(a2.show(b));  //5
        System.out.println(a2.show(c));  //6
        System.out.println(a2.show(d));  //7
        System.out.println(b.show(b));
        System.out.println(b.show(d));
        System.out.println(b.show(c));
	}
}

如圖,求列印的結果。

父類A應用多型進行過載,B,C,D都為子類。

對於第一條列印,a1為類A的物件,呼叫A中的方法,因為沒有B類作為引數,故以引數型別為A的方法優先呼叫,列印結果是A&A;

對於第二條列印,a1為類A的物件,呼叫A中的方法,因為沒有C類作為引數,故以引數型別為A的方法優先呼叫,列印結果是A&A;

對於第三條列印,a1為類A的物件,呼叫A中的方法,有D類作為引數的方法,故呼叫以引數型別為D的方法,列印結果是A&D;

對於第五條列印,父類引用指向子類物件,首先查詢B類中以A作為引數的方法,有以A作為引數的方法,故呼叫B類中的此方法,列印結果是:B&A;

對於第六條列印,父類引用指向子類物件,首先查詢B類的子類C類中以C作為引數的方法,沒有,則看C類父類B類中以C作為引數型別的,也沒有,則優先呼叫以A作為引數的方法;

對於第七條列印,父類引用指向子類物件,首先查詢B類中以D作為引數型別的方法,沒有(子類中沒有重寫父類中的方法,需要到父類中去找),則檢視父類A中以D作為引數型別的方法,A類中有,則呼叫,列印結果是A&D;

對於最後一條列印,b為B的物件,而b.show(c)傳遞的是C類的物件引數型別,子類C中沒有重寫父類,則到父類B中檢視,也沒有以C類作為引數的,則以父類的引數為準,呼叫型別為B的方法,列印結果是B&B

其它類似處理。。