第七天 繼承之方法重寫
方法覆蓋的註意事項:
1權限:子類的的權限(訪問修飾符)一定要不小於被重新的方法的權限(訪問修飾符)
2方法定義:方法名和參數列表必須一樣
3返回值:基本數據類型:子類和父類的必須一置
引用數據類型:子類可以與父類相同也可以是父類的子類
4拋出異常:子類拋出的異常不能超過父親拋出的異常(子類的異常不能大於父類的異常)
5不能被繼承就不能被重寫
6不能重新final修飾的方法
將方法或類聲明為final主要的目的就是:確保他們不會改變語義.
7靜態方法不能被重寫.如果子類也有一個與父類同名同參也用static修飾,那麽子類就會把繼承來的父類方法隱藏而不是重寫.簡單來說父類和子類的方法是兩個方法, 沒有關系,也不存在多態的性質,靜態方法是與類相關聯的
父類的非靜態方法不能被子類覆蓋為靜態方法,相反的父類的靜態也不能覆蓋為非靜態
重載和重寫的對比
重載:
權限修飾符(public private 默認):無關
方法名:重載的兩個方法的方法名必須相同
形參列表:
形參類型的順序不同
形參的個數不同
形參的類型不同
三者至少滿足一個
返回值類型:
重載與返回值類型無關
重寫:
權限修飾符(public private 默認):
子類方法的權限>=父類的方法的權限
方法名:
子類方法和父類方法必須相同
形參列表:
子類方法和父類方法的形參列表必須相同
返回值類型:
基本類數據類型:
必須相同
引用數據類型:
子類方法的返回值類型和父類方法的返回值類型相同
或者
子類方法的返回值類型是父類方法的返回值類型的子類
關於方法重載的一個原則
Liskov替換原則
核心抽象
為什麽要有這個原則
一個功能p1,由父類完成,現在需要增加新的功能p2,繼承之後,擴展為p3 這個p3是由p1和p2組成的,子類在完成新功能p2的時候可能使得p1發生故障
什麽是這個原則
所有引用基類(父類)的地方必須能透明地使用其子類的對象。
簡單來說就是對於子類型必須能夠替換掉他們的基類型,
再簡單點:子類可以擴展父類的功能,但不能改變父類的功能
4層次含義
子類可以實現父類的抽象方法,但不能覆蓋父類的抽象方法(關鍵所在)
當然這個不是硬性的規定而是一個建議,增加新的功能,盡可能不去重載父類的方法,而是盡力添加新的方法
子類可以增加自己的特有方法
子類實現父類的方法時,方法的形參不父類更加寬松.
子類實現父類方法時,方法的返回值比父類更加嚴格
第七天 繼承之方法重寫