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