更新時(shí)間:2021-05-06 12:59:22 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1486次
面向?qū)ο缶幊逃腥筇匦裕悍庋b、繼承、多態(tài)。

1.定義:
多態(tài):指允許不同類的對象對同一消息做出響應(yīng)。即同一消息可以根據(jù)發(fā)送對象的不同而采用多種不同的行為方式。(發(fā)送消息就是函數(shù)調(diào)用)。
通俗一點(diǎn)的說法:所謂多態(tài)就是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調(diào)用在編程時(shí)并不確定,而是在程序運(yùn)行期間才確定,即一個(gè)引用變量倒底會(huì)指向哪個(gè)類的實(shí)例對象,該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類中實(shí)現(xiàn)的方法,必須在由程序運(yùn)行期間才能決定。因?yàn)樵诔绦蜻\(yùn)行時(shí)才確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實(shí)現(xiàn)上,從而導(dǎo)致該引用調(diào)用的具體方法隨之改變,即不修改程序代碼就可以改變程序運(yùn)行時(shí)所綁定的具體代碼,讓程序可以選擇多個(gè)運(yùn)行狀態(tài),這就是多態(tài)性。
2.實(shí)現(xiàn)多態(tài)的技術(shù)稱為:動(dòng)態(tài)綁定(dynamic binding),是指在執(zhí)行期間判斷所引用對象的實(shí)際類型,根據(jù)其實(shí)際的類型調(diào)用其相應(yīng)的方法。
3.作用:消除類型之間的耦合關(guān)系。
1.消除類型之間的耦合關(guān)系
2.可替換性(substitutability):多態(tài)對已存在代碼具有可替換性。例如,多態(tài)對圓Circle類工作,對其他任何圓形幾何體,如圓環(huán),也同樣工作。
3.可擴(kuò)充性(extensibility):多態(tài)對代碼具有可擴(kuò)充性。增加新的子類不影響已存在類的多態(tài)性、繼承性,以及其他特性的運(yùn)行和操作。實(shí)際上新加子類更容易獲得多態(tài)功能。例如,在實(shí)現(xiàn)了圓錐、半圓錐以及半球體的多態(tài)基礎(chǔ)上,很容易增添球體類的多態(tài)性。
4.接口性(interface-ability):多 態(tài)是超類通過方法簽名,向子類提供了一個(gè)共同接口,由子類來完善或者覆蓋它而實(shí)現(xiàn)的。如圖8.3 所示。圖中超類Shape規(guī)定了兩個(gè)實(shí)現(xiàn)多態(tài)的接口方法,computeArea()以及computeVolume()。子類,如Circle和 Sphere為了實(shí)現(xiàn)多態(tài),完善或者覆蓋這兩個(gè)接口方法。
5.靈活性(flexibility):它在應(yīng)用中體現(xiàn)了靈活多樣的操作,提高了使用效率。
6.簡化性(simplicity):多態(tài)簡化對應(yīng)用軟件的代碼編寫和修改過程,尤其在處理大量對象的運(yùn)算和操作時(shí),這個(gè)特點(diǎn)尤為突出和重要。
1.繼承
2.重寫
3.父類引用指向子類對象(向上轉(zhuǎn)型)
向上轉(zhuǎn)型:在多態(tài)中需要將子類的引用賦給父類對象,只有這樣該引用才能夠具備技能調(diào)用父類的方法和子類的方法。
Animal a = new Cat(); // 向上轉(zhuǎn)型
Cat c = (Cat)a; // 向下轉(zhuǎn)型
方式一:繼承父類進(jìn)行方法重寫,同一個(gè)類中進(jìn)行方法重載
重寫:子父類出現(xiàn)一模一樣的方法,但返回值類型可以是子父類。
方法重寫的應(yīng)用:
當(dāng)子類需要父類的功能,而功能主體子類有自己的特有內(nèi)容時(shí),可以重寫父類中的方法。即沿用了父類的功能,又定義了子類特有的內(nèi)容。當(dāng)子類對象調(diào)用重寫的方法時(shí),調(diào)用的是子類的方法,而不是父類中被重寫的方法。
要想調(diào)用父類中被重寫的方法,則必須使用關(guān)鍵字 super。
重寫遵循“兩同兩小一大”規(guī)則:
兩同: 方法名、形參列表相同
兩?。?/p>
子類方法返回值類型應(yīng)比父類方法返回值類型更小或相等
子類方法聲明拋出的異常類應(yīng)比父類方法聲明拋出的異常類更小或相等
一大:
子類方法的訪問權(quán)限應(yīng)比父類方法訪問權(quán)限更大或相等
重寫注意點(diǎn)
父類中的私有方法不能被重寫,該方法對于子類是隱藏的,因此其子類無法訪問該方法,也無法重寫
父類靜態(tài)方法,子類也必須通過靜態(tài)方法進(jìn)行覆蓋,即靜態(tài)只能覆蓋靜態(tài)
子類重寫父類方法時(shí),最好聲明得一模一樣
如果子類中定義了一個(gè)與父類private方法具有相同的方法名、相同的形參列表、相同的返回值類型的方法,依然不是重寫,只是在子類中重新定義了一個(gè)新的方法,所以該新方法不會(huì)受父類方法的任何限制。
Override 和 Overload 的區(qū)別?Overload能改變返回值類型嗎?
Override是重寫,Overload是重載。重載可以改變返回值類型,它是方法名相同,參數(shù)列表不同,與返回值類型無關(guān)。
方法重寫:子類中出現(xiàn)和父類中方法聲明一模一樣的方法。返回值類型相同(或者是子父類,多態(tài)),方法名和參數(shù)列表一模一樣。主要發(fā)生在子類和父類的同名方法之間。
方法重載:本類中出現(xiàn)方法名相同,參數(shù)列表不同的方法,和返回值類型無關(guān),可以改變。主要發(fā)生同一類的多個(gè)同名方法之間。
子類對象調(diào)用方法時(shí),先找子類本身的方法,再找父類中的方法。
方式二:接口實(shí)現(xiàn)
生活中的接口最具代表性的就是插座,例如一個(gè)三接頭的插頭都能接在三孔插座中,因?yàn)檫@個(gè)是每個(gè)國家都有各自規(guī)定的接口規(guī)則,有可能到國外就不行,那是因?yàn)閲庾约憾x的接口類型。
java中的接口類似于生活中的接口,就是一些方法特征的集合,但沒有方法的實(shí)現(xiàn)。
方式三:抽象類和抽象方法
需要注意的問題
一是子類與父類的關(guān)系,二是重載方法的調(diào)用問題。
子類對象可以直接當(dāng)成父類對象使用,但反過來就不可以。舉例來說,人是父類,學(xué)生是人的子類,所以學(xué)生對象一定具備人對象的屬性,但是人對象就未必具有學(xué) 生對象的特性。所以學(xué)生對象可以當(dāng)做人對象來使用,但是人對象就不能當(dāng)做學(xué)生對象使用。注意當(dāng)把子類對象當(dāng)成父類對象使用時(shí),子類對象將失去所有的子類特性,只保留與父類同名的屬性和方法(同名方法不僅是函數(shù)名相同,而且參數(shù)類型也要一樣,否則不予保留)。
以上就是動(dòng)力節(jié)點(diǎn)小編介紹的"Java多態(tài)是什么"的內(nèi)容,希望對大家有幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為您服務(wù)。
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)

初級 202925

初級 203221

初級 202629

初級 203743