Java中多態(tài)性的實(shí)現(xiàn)方式
什么是多態(tài)
- 面向?qū)ο蟮娜筇匦裕悍庋b、繼承、多態(tài)。從一定角度來看,封裝和繼承幾乎都是為多態(tài)而準(zhǔn)備的。這是我們最后一個(gè)概念,也是最重要的知識點(diǎn)。
- 多態(tài)的定義:指允許不同類的對象對同一消息做出響應(yīng)。即同一消息可以根據(jù)發(fā)送對象的不同而采用多種不同的行為方式。(發(fā)送消息就是函數(shù)調(diào)用)
- 實(shí)現(xiàn)多態(tài)的技術(shù)稱為:動態(tài)綁定(dynamic binding),是指在執(zhí)行期間判斷所引用對象的實(shí)際類型,根據(jù)其實(shí)際的類型調(diào)用其相應(yīng)的方法。
- 多態(tài)的作用:消除類型之間的耦合關(guān)系。
- 現(xiàn)實(shí)中,關(guān)于多態(tài)的例子不勝枚舉。比方說按下 F1 鍵這個(gè)動作,如果當(dāng)前在 Flash 界面下彈出的就是 AS 3 的幫助文檔;如果當(dāng)前在 Word 下彈出的就是 Word 幫助;在 Windows 下彈出的就是 Windows 幫助和支持。同一個(gè)事件發(fā)生在不同的對象上會產(chǎn)生不同的結(jié)果。
下面是多態(tài)存在的三個(gè)必要條件,要求大家做夢時(shí)都能背出來!
多態(tài)存在的三個(gè)必要條件
一、要有繼承;
二、要有重寫;
三、父類引用指向子類對象。
多態(tài)的好處:
1.可替換性(substitutability)。多態(tài)對已存在代碼具有可替換性。例如,多態(tài)對圓Circle類工作,對其他任何圓形幾何體,如圓環(huán),也同樣工作。
2.可擴(kuò)充性(extensibility)。多態(tài)對代碼具有可擴(kuò)充性。增加新的子類不影響已存在類的多態(tài)性、繼承性,以及其他特性的運(yùn)行和操作。實(shí)際上新加子類更容易獲得多態(tài)功能。例如,在實(shí)現(xiàn)了圓錐、半圓錐以及半球體的多態(tài)基礎(chǔ)上,很容易增添球體類的多態(tài)性。
3.接口性(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è)接口方法。
4.靈活性(flexibility)。它在應(yīng)用中體現(xiàn)了靈活多樣的操作,提高了使用效率。
5.簡化性(simplicity)。多態(tài)簡化對應(yīng)用軟件的代碼編寫和修改過程,尤其在處理大量對象的運(yùn)算和操作時(shí),這個(gè)特點(diǎn)尤為突出和重要。
Java中多態(tài)的實(shí)現(xiàn)方式:接口實(shí)現(xiàn),繼承父類進(jìn)行方法重寫,同一個(gè)類中進(jìn)行方法重載。
一個(gè)小題目:
(一)相關(guān)類
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...{}
(二)問題:以下輸出結(jié)果是什么?
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)); ⑨
(三)答案
① A and A ② A and A ③ A and D ④ B and A ⑤ B and A ⑥ A and D ⑦ B and B ⑧ B and B ⑨ A and D
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java中字符串轉(zhuǎn)int數(shù)據(jù)類型的三種方式
這篇文章主要介紹了Java中字符串轉(zhuǎn)int數(shù)據(jù)類型的三種方式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03Java異常處理操作 Throwable、Exception、Error
這篇文章主要介紹了Java異常處理操作 Throwable、Exception、Error,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06SpringCloud Webflux過濾器增加header傳遞方式
這篇文章主要介紹了SpringCloud Webflux過濾器增加header傳遞方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02解決IDEA中Maven下載依賴包過慢或報(bào)錯(cuò)的問題
由于公司項(xiàng)目迭代,越來越多的項(xiàng)目開始轉(zhuǎn)型新版本,由于我對Java一直不感冒,但要順應(yīng)公司項(xiàng)目要求,遂自己要逐步開始完善Java相關(guān)的知識層面,此篇是我在學(xué)習(xí)SpringBoot時(shí)對一些不懂地方及遇到問題時(shí)的記錄,需要的朋友可以參考下2024-02-02Springboot容器級后置處理器BeanDefinitionRegistryPostProcessor
這篇文章主要介紹了Springboot容器級后置處理器BeanDefinitionRegistryPostProcessor,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01Java設(shè)置token有效期的5個(gè)應(yīng)用場景(雙token實(shí)現(xiàn))
Token最常見的應(yīng)用場景之一就是身份驗(yàn)證,本文主要介紹了Java設(shè)置token有效期的5個(gè)應(yīng)用場景(雙token實(shí)現(xiàn)),具有一定的參考價(jià)值,感興趣的可以來了解一下2024-04-04關(guān)于SpringBoot中事務(wù)失效的幾種情況
這篇文章主要介紹了關(guān)于SpringBoot中事務(wù)失效的幾種情況,Spring AOP默認(rèn)使用動態(tài)代理,會給被代理的類生成一個(gè)代理類,事務(wù)相關(guān)的操作都通過代理來完成,使用內(nèi)部方法調(diào)用時(shí),使用的是實(shí)例調(diào)用,沒有通過代理類調(diào)用方法,因此事務(wù)不會檢測到失敗,需要的朋友可以參考下2023-08-08使用IDEA創(chuàng)建Servlet程序的詳細(xì)步驟
在學(xué)習(xí)servlet過程中,參考的教程是用eclipse完成的,而我在練習(xí)的過程中是使用IDEA的,在創(chuàng)建servlet程序時(shí)遇到了挺多困難,在此記錄一下如何用IDEA完整創(chuàng)建一個(gè)servlet程序,感興趣的朋友一起看看吧2024-08-08