150天打卡day13_方法的重寫
上節(jié)回顧
繼承的定義:繼承就是子類繼承父類的特征和行為,使得子類具有父類相同的特征和行
為。is-a的關(guān)系
super關(guān)鍵字:父類對(duì)象,可以訪問父類的屬性和方法
向上造型:父類引用指向子類對(duì)象
重寫的定義
重寫中使用super關(guān)鍵字
重寫和重載和區(qū)別
本節(jié)重點(diǎn)
為什么要重寫呢?
父類已經(jīng)有這個(gè)功能的方法了,子類假如有相同功能的方法,使用重寫的方式更加便利,
不會(huì)造成子類既繼承得到了父類的這個(gè)功能,又自己擁有一個(gè)同樣的功能而方法名卻不一
樣的尷尬境地。
繼承是多態(tài)的前提,重寫方法也是為了多態(tài)的擴(kuò)展性的。
重寫的定義
重寫是子類對(duì)父類的允許訪問的方法的實(shí)現(xiàn)過程進(jìn)行重新編寫的過程,要求方法名和參數(shù)列
表不變(方法的簽名)即外殼不變,核心重寫!
@override的作用
可以當(dāng)注釋用,方便閱讀;
編譯器可以給你驗(yàn)證@Override下面的方法名是否是你父類中所有的,如果沒有則報(bào)錯(cuò)。
例如,你如果沒寫@Override,而你下面的方法名又寫錯(cuò)了,這時(shí)你的編譯器是可以編譯
通過的,因?yàn)榫幾g器以為這個(gè)方法是你的子類中自己增加的方法。
測(cè)試類
?
在上面的例子中可以看到,盡管b屬于Animal類型,但是它運(yùn)行的是Dog類的move方法。
這是由于在編譯階段,只是檢查參數(shù)的引用類型。
然而在運(yùn)行時(shí),Java虛擬機(jī)(JVM)指定對(duì)象的類型(Dog類型)并且運(yùn)行該對(duì)象的方法。
因此在上面的例子中,之所以能編譯成功,是因?yàn)锳nimal類中存在move方法,然而運(yùn)行時(shí),
運(yùn)行的是特定對(duì)象(Dog類)的方法。
故而當(dāng)子類對(duì)象的重寫方法被調(diào)用時(shí),無(wú)論是通過子類的引用調(diào)用還是父類的引用調(diào)用,運(yùn)行
的是子類重寫后的方法。
?
思考:子類中定義方法,用Animal的引用b能不能調(diào)到?
測(cè)試:
該程序?qū)伋鲆粋€(gè)編譯錯(cuò)誤,因?yàn)閎的引用類型Animal沒有bark方法。
重寫中使用super關(guān)鍵字
當(dāng)需要在子類中調(diào)用父類的被重寫方法時(shí),需要用到super關(guān)鍵字
測(cè)試
案例
群發(fā)郵件
Email父類
myEmail子類
重載和重寫的區(qū)別
重載(overload)
重載是發(fā)生在一個(gè)類里,要求方法名相同,參數(shù)列表不同。
常用于構(gòu)造器的重載
重載規(guī)則:
被重載的方法必須參數(shù)類型,個(gè)數(shù),順序不同
方法的重載與修飾符和返回值無(wú)關(guān)
方法的重載要求發(fā)生在一個(gè)類中
重寫(override)
重寫以繼承為基礎(chǔ),是子類對(duì)父類的允許訪問的方法的實(shí)現(xiàn)過程進(jìn)行重新編寫,返回值和參數(shù)
列表還有方法名都不允許變,外殼不變,核心重寫
重寫規(guī)則:
重寫必須是以繼承為基礎(chǔ),如果不能繼承這個(gè)類,則不能重寫類中的方法
兩同(方法名相同,參數(shù)類型相同)
重寫的方法方法名必須和被重寫方法一致
重寫的方法參數(shù)列表必須保持一致
兩?。?/strong>返回值類型、異常)
子類返回類型小于等于父類方法返回類型(返回值類型的大小指的是父子類的大小,父類
比子類大)
void 時(shí)和父類一致
基本數(shù)據(jù)類型時(shí)和父類一致
引用類型時(shí)小于父類
Son類中重寫Father的方法,F(xiàn)ather的返回值為A,那么Son類的返回值類型,只能是A或A的子
類,不能是Object,也就是?只能是A或B,不能是Object。
子類拋出異常小于等于父類方法拋出異常
聲明異常的小指的跟返回值類型的小是一樣的,比如父類聲明了 一個(gè)父類異常IOException 那
么子類聲明的異常只能是IOException或其子類,不能是IOException的父類;
并且子類的聲明異常要被父類聲明的異常包含,什么意思呢?比如父類聲明了多個(gè)異常,子類
只能聲明父類聲明的異常被包含的范圍內(nèi),
比如,父類聲明了A,B,C異常,子類只能最多聲明A,B,C當(dāng)然,子類只聲明A也是可以的
但是這里有點(diǎn)小特殊的地方:比如父類聲明了A異常,子類重寫的方法聲明多個(gè)A異常的子
類,是可以的。(其實(shí)意思就是子類重寫的方法聲明的異常是父類聲明的異常被包含的范圍
內(nèi))
?
一大
子類訪問權(quán)限大于等于父類方法訪問權(quán)限
public>protected>default>private
總結(jié)
重載(overload)和重寫(override)的區(qū)別

?
方法的重寫和重載是Java 多態(tài)性的不同表現(xiàn),重寫是父類與子類之間多態(tài)性的一種表現(xiàn),重
載可以理解為是多態(tài)的具體表現(xiàn)形式。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?