Java-多態的理解(主要是解釋一個網上經典的例子)

如題,本文重點不在於介紹什麼是多態,因此一些基礎的概念就很少說了(須要知道的時候會提一下)。要了解多態的話這裏推薦一篇 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

  • 什麼是重寫 (其中一個要求是:參數列表必須與被重寫方法的相同)
  • 向上轉型和向下轉型 (相似於int和long之間的自動轉換和強制轉換,向上->子轉父->自動,向下->父轉子->需強制)
  • 理解一句話:當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法,可是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。
    (也就是說 View v = new TextView(context),v.setBackground()的話優先調用TextView的setBackground,若是TextView沒有重寫setBackground的話才調用父類View的setBackground)

上面的3點必定要理解括號裏面說的,下面有用對象


解釋第4點

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點的理解思路,其餘幾個應該很容易看懂了基礎

相關文章
相關標籤/搜索