方法的覆蓋
回憶:方法的重載。
當在同一個類當中,方法完成的功能是相似的,建議方法名相同,這樣方便程序員的編程。
- 使用的情況:
1.在同一個類中。
2.方法名相同
3.參數列表不同:類型,順序,個數。
方法的覆蓋:
方法的覆蓋又被稱爲方法的重寫(overwrite,override) - 什麼時候使用方法的覆蓋(重寫)?
當父類中的方法已經無法滿足子類的需求。
子類有必要將父類中繼承過來的方法進行重新編寫。這個重新編寫的過程稱爲方法重寫。/方法的覆蓋。
什麼條件滿足後方法會發生重寫呢? - 方法重寫發生在具有繼承關係的父子類之間,返回前類型相同,方法名相同,形參列表相同。(內容不同)
- 訪問權限不能更低,只能更高。
- 拋出的異常不能更多,只能更少。
- 建議複製粘貼。
注意:
私有方法不能繼承,所以不能覆蓋。
構造方法不能繼承,所以不能覆蓋。(構造方法的方法名與類名必須一樣,父子類不能同名,故不能繼承 更不可能被重寫 可以重載-----某些情況對象的初值不同)
覆蓋只對方法。
靜態方法不能覆蓋。
多態
- 幾個概念:
向上轉型(upcasting):
子類型–>父類型
又稱爲:自動類型轉換。
向下轉型(downcasting):
父類型–>子類型
又被稱爲:強制類型轉換。
但他們都必須有繼承關係。
多態語法機制:
Cat 繼承於 Animal。
Animal a2 = new Cat();子–>父類型,java允許。引用a2爲Animal類型,指向的對象類型爲Cat類型,在運行時還是會以具體的對象Cat運行。
- 父類中沒有子類的方法,可以向下轉型,強制類型轉換。
- 當調用的方法是子類型中特有的,在父類中不存在,必須進行向下轉型。
Animal c2 =new Cat ();
Cat a2 = (Cat)c2;
Animal a3 = new Bird();
Cat c3 = (Cat)a3;此種編譯能通過,但無法運行,會發生異常,因爲Bird類和Cat之間無繼承關係。(自定義)
向上轉型編譯通過,運行一定不會出現問題。
向下轉型不一定。 - 怎麼避免出現異常呢?
- instanceof運算符可以做到。
- instanceof怎麼用?
語法格式:
引用 instanceof 數據類型名。
其執行結果爲boolean:
假設:A instanceof Animal
結果:ture:A 是Animal類型。
flase:A不是Animal類型。
if(a3 instanceof Animal){//a3是Animal的對象。
強制類型轉換。
}
多態性,可以增強擴展力,降低耦合度。