二、Java面向對象(9)_面向對象——多態思想
2018-05-02
多態思想
多態是同一個行為具有多個不同表現形式或形態的能力。
多態就是同一個接口,使用不同的實例而執行不同操作,如圖所示:
多態性是對象多種表現形式的體現。
現實中,比如我們按下 F1 鍵這個動作:
- 如果當前在 Flash 界面下彈出的就是 AS 3 的幫助文檔;
- 如果當前在 Word 下彈出的就是 Word 幫助;
- 在 Windows 下彈出的就是 Windows 幫助和支持。
同一個事件發生在不同的對象上會產生不同的結果。
--------------------------------------------------------------------------------------------------
比如你是一個酒神,對酒情有獨鐘。某日回家發現桌上有幾個杯子裏面都裝了白酒,從外面看我們是不可能知道這是些什麽酒,只有喝了之後才能夠猜出來是何種酒。你一喝,這是劍南春、再喝這是五糧液、再喝這是酒鬼酒….在這裏我們可以描述成如下:
酒 a = 劍南春 //此時a表示劍南春類型的形態
酒 b = 五糧液 //此時b表示劍南春類型的形態
酒 c = 酒鬼酒 //此時c表示劍南春類型的形態
…
這裏所表現的的就是多態。劍南春、五糧液、酒鬼酒都是酒的子類,我們只是通過酒這一個父類就能夠引用不同的子類,這就是多態——我們只有在運行的時候才會知道引用變量所指向的具體實例對象
對象(a/b/c)具有兩種類型:
編譯類型:聲明變量的類型,酒
運行類型:對象的真實類型,劍南春/五糧液/酒鬼酒
編譯類型必須是運行類型的父類(向上轉型)或者和運行類型相同(向下轉型),多態就是編譯類型是運行類型的父類。
在上面的喝酒例子中,酒(Win)是父類,劍南春(JNC)、五糧液(WLY)、酒鬼酒(JGJ)是子類。我們定義如下代碼:
JNC a = new JNC();
對於這個代碼我們非常容易理解無非就是實例化了一個劍南春的對象嘛!但是這樣呢?
Wine a = new JNC();
在這裏我們這樣理解,這裏定義了一個Wine 類型的a,它指向JNC對象實例。由於JNC是繼承與Wine,所以JNC可以自動向上轉型為Wine,所以a是可以指向JNC實例對象的。
這樣做存在一個非常大的好處,在繼承中我們知道子類是父類的擴展,它可以提供比父類更加強大的功能,如果我們定義了一個指向子類的父類引用類型,那麽它除了能夠引用父類的共性外,還可以使用子類強大的功能。
----------------------------------------------------------------------------------------------------------------------------------------------------
多態的實現條件:
1、繼承(類與類)或接口(接口和實現類)
2、覆蓋(重寫)
3、父類引用指向子類對象(向上轉型)
原則:當超(父)類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法(即由子類對象的類型決定調用誰的方法),
但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。
----------------------------------------------------------------------------------------------------------------------------------
多態的特點:
父類引用指向子類對象,在運行時期會表現具體的子類特征。
指向子類的父類引用由於向上轉型了,它只能訪問父類中擁有的方法和屬性,而對於子類中存在而父類中不存在的方法,該引用是不能使用的,盡管是重載該方法。
如果子類重寫了父類中的某些方法,在調用這些方法的時候,必定是使用子類中定義的這些方法(動態連接、動態調用)。
二、Java面向對象(9)_面向對象——多態思想