如題,本文重點不在於介紹什麼是多態,因此一些基礎的概念就很少說了(須要知道的時候會提一下)。要了解多態的話這裏推薦一篇 http://www.cnblogs.com/jack204/archive/2012/10/29/2745150.html
本文要解釋的例子也是這篇文章裏面的,代碼以下:html
相關類ide
class A { public String show(D obj) { return ("A and D"); } public String show(A obj) { return ("A and A"); } } class B extends A { public String show(B obj) { return ("B and B"); } public String show(A obj) { return ("B and A"); } } class C extends B {} class D extends B {}
思考如下輸出結果code
A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); D d = new D(); System.out.println("1--" + a1.show(b)); // 1--A and A System.out.println("2--" + a1.show(c)); // 2--A and A System.out.println("3--" + a1.show(d)); // 3--A and D System.out.println("4--" + a2.show(b)); // 4--B and A System.out.println("5--" + a2.show(c)); // 5--B and A System.out.println("6--" + a2.show(d)); // 6--A and D System.out.println("7--" + b.show(b)); // 7--B and B System.out.println("8--" + b.show(c)); // 8--B and B System.out.println("9--" + b.show(d)); // 9--A and D
爲了方便查看,我把程序的輸出結果以註釋的形式寫在代碼裏了。上面的代碼前3個很好理解,從第4個開始可能不少人就會以爲有一些奇怪了(爲何輸出的不是B and B),其實要理解這個很容易,只要默想一下幾個基本概念就好了:htm
上面的3點必定要理解括號裏面說的,下面有用對象
A a2 = new B();
B b = new B();
System.out.println("4--" + a2.show(b));
輸出結果:4--B and Ablog
對於 a2.show(b) ,先看a2是什麼類型,沒錯,是A類型的,A類裏面有哪些方法呢,看一眼並無參數是B的show方法,因此a2.show(b)
並不會調用B類裏面參數是B的方法 (B類裏面參數是B的show方法並非重寫的父類方法,它是B類本身的方法,能夠加@Override看看報錯不,因此A類型的引用a2調不到這個方法),這就是輸出結果不是 B and B 的緣由。get
而後輸出結果爲何是B and A?首先不難想到調用的是 show(A obj) 這個參數是A的方法(自動向上轉型),又由於子類B重寫了這個方法,因此調用了子類裏面的show(A obj)方法(這就是要理解的那個:超類引用變量引用子類對象若是子類重寫了方法優先調用子類的方法)class
好了,根據第4點的理解思路,其餘幾個應該很容易看懂了基礎