首先我們知道Java是一門面向對象的語言 面向對象三大特性,封裝、繼承、多態。 封裝、繼承、多態 ↓ 無論是學習路線,還是眾人的口語習慣,都是按照這個這樣進行排序,這是有原因的。因為封裝好了才能繼承,封裝和繼承都是為多態做準備的。 多態的三個前提條件: 1、繼承關係 2、方法的重寫 3、向上轉型(即 ...
首先我們知道Java是一門面向對象的語言
面向對象三大特性,封裝、繼承、多態。
封裝、繼承、多態 ↓
無論是學習路線,還是眾人的口語習慣,都是按照這個這樣進行排序,這是有原因的。因為封裝好了才能繼承,封裝和繼承都是為多態做準備的。
多態的三個前提條件:
1、繼承關係
2、方法的重寫
3、向上轉型(即父類引用指向子類對象)
多態又分為兩種情況,編譯時多態,運行時多態。先簡單介紹一下這兩種的區別
編譯時多態:對象引用本類實例
廢話不多直接上圖舉例:
上圖我們看到cat對象和animal對象都是引用的本類實例,也就是說,在方法啟動前,編譯已經確定了上面兩個toString方法分別是誰調用的
運行時多態:父類引用指向子類對象
上圖是父類引用指向子類對象,也就是向上轉型。這裡的toString方法我們知道返回的肯定是子類的方法的結果。這就是Java的運行時多態(接下來是重點,註意看了),Java從實例類開始尋找匹配的方法,如果沒有匹配的方法,沿著繼承關係逐漸往上匹配父類的方法。
上面的關係捋順再說明多態的好處:
我們看到Cat類是繼承Animal類的,繼承性提高了代碼的可維護性
向上轉型,不同的實例類,產生不同的結果。如果我在定義一個Dog類也是一樣,會輸出Dog的toString。這就是代碼的可拓展性