1. 程式人生 > >多型典型例子

多型典型例子

我們先來談談一個多型靜態方法重寫的例子:

package classfileStaticcover;
class A
{
    public static void test()
    {
        System.out.println("be cover ");
    }
}

class B extends A
{
    public static void test()
    {
        System.out.println("cover");
    }
}

public class StatiCover
{
    public static void
main(String[] args) { A a_and_b = new B(); a_and_b.test(); } }

上面的程式碼輸出的是父類test()方法裡面的字串。

再來看看一段程式碼,這段程式碼也是我今天看到了,覺得比較有用就拿來分析多型典型的例子:

package classfile;
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{} public class TypiucalTest { 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)); System.out.println(a1.show(c)); System.out.println(a1.show(d)); System.out.println(a2.show(b)); System.out.println(a2.show(c)); System.out.println(a2.show(d)); System.out.println(b.show(b)); System.out.println(b.show(c)); System.out.println(b.show(d)); } }

輸出結果如下面:
這裡寫圖片描述

前面三個輸出估計沒有問題,接下來說明一下第四個,首先a2是A類的引用變數,它所指向的物件是B類的物件,可以看出這就是多型的特性,a2.show(b);計算機的執行過程為:首先到父類中尋找show(B obj)這個方法,但是發現找不到,於是找到形參為A定義的show(A obj)這個函式,把b賦值給a,在這一步上又有出現多型的特性,此時按理來說是輸出的“A and A”,但是不然,因為show(A obj)這個函式被子類B重寫了所以說要呼叫子類中的show(A obj)這個函式,以上三步是執行全過程,由此可以看出,多型特性中用父類變數呼叫成員方法是通過子類物件來呼叫的,所以最後一步呼叫了子類重寫父類的成員方法。有些書上總結了一些公式,但我覺得這種問題還是要從解析記憶體上理解,後面的幾個也差不多。