A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C();
阿新 • • 發佈:2019-01-06
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
其它類似處理。。