java中多型的理解,instanceof關鍵字,向上向下轉型的理解
一、多型的定義
比如:人可以是學生,也可以是老師,也可以是軍人。這就表現了人的多種形態性。多型就是多種形態。
多型的最終體現為:父類的引用變數可以指向子類物件。
多型的前提是必須有子父類關係,或者類實現介面關係,否則無法完成多型。
在使用多型後,父類的引用變數呼叫方法時,會呼叫子類重寫後的方法。
二、多型使用格式
多型的格式就是父類的引用變數指向子類物件。
此外:抽象類,介面都可以實現多型的形式。
三、多型的成員變數和方法。
這個很重要!
不管怎麼樣,父類必須有。但是變數執行的是父類的,方法執行的是子類的。
即:編譯看父類,執行看子類。
四、關鍵字instanceof
instanceof 關鍵字,用於引用型別的比較判斷。有關係的判斷。即:判斷是不是給定的引用型別。
注意instanceof 只能對有繼承關係的類,有實現關係的類的判斷。其他關係類的判斷是不行的。
五、多型中的向上轉型
java中型別的轉換包含自動型別轉換和強制型別轉換。多型的向上轉型就屬於自動型別轉換。多型向下轉型就是強制型別轉變
除了引用型別的向上轉型,還有引用型別的向下轉型。如圖
六、提出一個問題
1、為什麼要進行向上向下轉型。
向上轉型表示:將子類的物件賦值給父類的引用物件。如果不向上轉型,子類重寫了自己的方法,子類只能呼叫自己重寫的父類方法。
注意:向上轉型後只能呼叫父類子類共有的方法,子類擴充套件的方法無法呼叫。父類的所有方法都被子類繼承。即使子類沒有重寫,子類就是有。如果要呼叫子類自己的方法需要向下轉型。
那麼為什麼不直接建立一個子類物件呢?
其實問題的關鍵在於,子類重寫了父類的方法,向上轉型讓父類引用變數可以呼叫子類重寫父類的方法。但不能呼叫子類重寫的方法。如果要呼叫子類重寫的方法,向下轉型。向上轉型還提升了擴充套件性,即:不需要建立子類例項
七、面向物件三大特徵
1、封裝:提高了安全性。
2、繼承: 程式擴充套件性
3、多型:減少程式碼重複,提升擴充套件。沒有方法重寫,就沒有多型。
八、小知識
匿名物件:
下面括號裡可以寫m,或者用匿名物件直接寫new Mouse()。
在實際應用中,把方法的引數設定為介面,非常好。