- 相關(guān)推薦
Java中的多態(tài)用法實(shí)例分析
多態(tài)分兩種:
(1) 編譯時(shí)多態(tài)(設(shè)計(jì)時(shí)多態(tài)):方法重載。
(2) 運(yùn)行時(shí)多態(tài):JAVA運(yùn)行時(shí)系統(tǒng)根據(jù)調(diào)用該方法的實(shí)例的類型來(lái)決定選擇調(diào)用哪個(gè)方法則被稱為運(yùn)行時(shí)多態(tài)。(我們平時(shí)說(shuō)得多的事運(yùn)行時(shí)多態(tài),所以多態(tài)主要也是指運(yùn)行時(shí)多態(tài))
運(yùn)行時(shí)多態(tài)存在的三個(gè)必要條件:
一、要有繼承(包括接口的實(shí)現(xiàn));
二、要有重寫(xiě);
三、父類引用指向子類對(duì)象。
詳細(xì)解釋:
運(yùn)行時(shí)多態(tài)的解釋:a.運(yùn)行時(shí)多態(tài)是指程序中定義的引用變量所指向的具體類型和b.通過(guò)該引用變量發(fā)出的方法調(diào)用在編程時(shí)并不確定,而是在程序運(yùn)行期間才確定,即一個(gè)引用變量倒底會(huì)指向哪個(gè)類的實(shí)例對(duì)象,該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類中實(shí)現(xiàn)的方法,必須在由程序運(yùn)行期間才能決定.
1.程序序中定義的引用變量所指向的具體類型不確定(即一個(gè)引用變量倒底會(huì)指向哪個(gè)類的實(shí)例對(duì)象) 。
例子 :
driver 類中 drive 方法 (Vehicle類 vehicle){}
oneDriver.drive( new car() )
oneDriver.drive( new bus() )
其中vehicle 變量無(wú)法確定具體使用哪個(gè)子類實(shí)例。
1.通過(guò)該引用變量發(fā)出的方法調(diào)用在編程時(shí)并不確定(該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類中實(shí)現(xiàn)的方法) 。
例子 : 廚師,園丁,理發(fā)師的Cut 方法調(diào)用.persion.cut().
多態(tài)的好處:
1.可替換性(substitutability)。多態(tài)對(duì)已存在代碼具有可替換性。例如,多態(tài)對(duì)圓Circle類工作,對(duì)其他任何圓形幾何體,如圓環(huán),也同樣工作。
2.可擴(kuò)充性(extensibility)。多態(tài)對(duì)代碼具有可擴(kuò)充性。增加新的子類不影響已存在類的多態(tài)性、繼承性,以及其他特性的運(yùn)行和操作。實(shí)際上新加子類更容易獲得多態(tài)功能。例如,在實(shí)現(xiàn)了圓錐、半圓錐以及半球體的多態(tài)基礎(chǔ)上,很容易增添球體類的多態(tài)性。
3.接口性(interface-ability)。多態(tài)是超類通過(guò)方法簽名,向子類提供了一個(gè)共同接口,由子類來(lái)完善或者覆蓋它而實(shí)現(xiàn)的。如圖8.3 所示。圖中超類Shape規(guī)定了兩個(gè)實(shí)現(xiàn)多態(tài)的接口方法,computeArea()以及computeVolume()。子類,如Circle和Sphere為了實(shí)現(xiàn)多態(tài),完善或者覆蓋這兩個(gè)接口方法。
4.靈活性(flexibility)。它在應(yīng)用中體現(xiàn)了靈活多樣的操作,提高了使用效率。
5.簡(jiǎn)化性(simplicity)。多態(tài)簡(jiǎn)化對(duì)應(yīng)用軟件的代碼編寫(xiě)和修改過(guò)程,尤其在處理大量對(duì)象的運(yùn)算和操作時(shí),這個(gè)特點(diǎn)尤為突出和重要。
實(shí)際運(yùn)用:
結(jié)合配置文件的使用,聯(lián)系Spring框架,利用反射,動(dòng)態(tài)的調(diào)用類,同時(shí)不用修改源代碼,直接添加新類和修改配置文件,不需要重啟服務(wù)器便可以擴(kuò)展程序。
小結(jié):
使用父類類型的引用指向子類的對(duì)象,該引用調(diào)用的師父類中定義的方法和變量,變量不能被重寫(xiě)(覆蓋);如果子類中重寫(xiě)了父類中的一個(gè)方法,那么在調(diào)用這個(gè)方法的時(shí)候,將會(huì)調(diào)用子類中的這個(gè)方法;
注意特殊情況,如果該父類引用所調(diào)用的方法參數(shù)列表未定義,就調(diào)用該父類的父類中查找,如果還沒(méi)找到就強(qiáng)制向上類型轉(zhuǎn)換參數(shù)列表中的參數(shù)類型,具體優(yōu)先級(jí)高到低依次如下:
this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。
【Java中的多態(tài)用法實(shí)例分析】相關(guān)文章:
java中通用的線程池實(shí)例代碼08-27
Java中ArrayList類的使用用法04-03
php中引用的用法分析04-01
java調(diào)用c函數(shù)的實(shí)例04-03
Java實(shí)現(xiàn)在不同線程中運(yùn)行的代碼實(shí)例詳解11-20
Java隊(duì)列類編寫(xiě)實(shí)例11-30
java讀取解析xml文件實(shí)例12-01
Yii框架form表單用法實(shí)例03-02