更新時間:2020-04-21 14:08:12 來源:動力節(jié)點(diǎn) 瀏覽2472次
我們都知道面向?qū)ο笥兴膫€基本特性:抽象、封裝、繼承、多態(tài)。這四個特性,概括起來可以這么理解,抽象、封裝、繼承是多態(tài)的基礎(chǔ),多態(tài)是抽象、封裝、繼承的表現(xiàn)。多態(tài),是Java中非常重要的一個部分,所以今天來談一下多態(tài)(Polymorphism)。
什么是多態(tài)
不同類的對象對同一消息作出不同的響應(yīng)就叫做多態(tài)。就像上課鈴響了,上體育課的學(xué)生跑到操場上站好,上語文課的學(xué)生在教室里坐好一樣。
多態(tài)的作用
簡單講就是解耦。再詳細(xì)點(diǎn)講就是,多態(tài)是設(shè)計模式的基礎(chǔ),不能說所有的設(shè)計模式都使用到了多態(tài),但是23種中的很大一部分,都是基于多態(tài)的。
多態(tài)存在的三個條件
1、有繼承關(guān)系
2、子類重寫父類方法
3、父類引用指向子類對象
補(bǔ)充一下第二點(diǎn),既然多態(tài)存在必須要有“子類重寫父類方法”這一條件,那么以下三種類型的方法是沒有辦法表現(xiàn)出多態(tài)特性的(因為不能被重寫):
1、static方法,因為被static修飾的方法是屬于類的,而不是屬于實(shí)例的
2、final方法,因為被final修飾的方法無法被子類重寫
3、private方法和protected方法,前者是因為被private修飾的方法對子類不可見,后者是因為盡管被protected修飾的方法可以被子類見到,也可以被子類重寫,但是它是無法被外部所引用的,一個不能被外部引用的方法,怎么能談多態(tài)呢
多態(tài)的分類
1、編譯時多態(tài),即方法的重載,從JVM的角度來講,這是一種靜態(tài)分派(staticdispatch)
2、運(yùn)行時多態(tài),即方法的重寫,從JVM的角度來講,這是一種動態(tài)分派(dynamicdispatch)
關(guān)于這一點(diǎn),在寫到JVM的時候會詳細(xì)講到。
分析多態(tài)問題的幾條原則
如果不去理解多態(tài)的原理,就從使用的角度來講,以個人的學(xué)習(xí)、工作這幾年的經(jīng)驗,總結(jié)出了多態(tài)無非就是三句話:
比如我們有一個父類Father,有一個子類Children
1、向上轉(zhuǎn)型是自動的。即Fatherf=newChildren()是自動的,不需要強(qiáng)轉(zhuǎn)
2、向下轉(zhuǎn)型要強(qiáng)轉(zhuǎn)。即Childrenc=newFather()是無法編譯通過的,必須要Childrenc=(Children)newFather(),讓父類知道它要轉(zhuǎn)成具體哪個子類
3、父類引用指向子類對象,子類重寫了父類的方法,調(diào)用父類的方法,實(shí)際調(diào)用的是子類重寫了的父類的該方法。即Fatherf=newChildren(),f.toString()實(shí)際上調(diào)用的是Children中的toString()方法
以上就是動力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對“Java基礎(chǔ)學(xué)習(xí):java多態(tài)的概念”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743