Java基礎14-多態(思想、轉型、instanceof)
一、什麽是多態?
1.多態的定義
多態,字面意思就是多種狀態,他表示一種事物的多種狀態。
class Animal{ public void eat() { System.out.println("吃一般的食物"); } } //狗和貓類繼承動物類並重寫eat方法 class Dog extends Animal{ public void eat() { System.out.println("吃骨頭"); } } class Cat extends Animal{ public void eat() { System.out.println("吃魚"); } } public class duotai { public static void main(String[] args) { //當代碼變為一下樣子多態就產生了 Animal a=new Dog(); a.eat(); a=new Cat(); a.eat(); } }
上邊對象a具有兩種類型
編譯類型:聲明對象變量的類型,Animal表示把對象看出什麽類型
運行類型:對象的真實類型,Dog運行類型 對象的真實類型
編譯類型必須是運行類型的父類或相同
當編譯類型和運行類型不同的時候,多態就出現了
所謂多態:對象具有多種形態,對象可以存在不同的形式。
其實就是,我們創建了一個動物對象,這個動物對象即可以是貓,也可以是狗,是貓的時候吃魚,是狗的時候吃骨頭。
Animal a=new Dog() //此時a表示Dog類型的形態
a=new Cat() //此時a表示Cat類型的形態
2.多態的前提和特點
多態的前提:必須有繼承關系(錯誤的說法)
可以是繼承關系,也可以是實現關系(接口和實現類)。正確
多態的特點:
把子類對象賦給父類變量,在運行時期會表現出具體的子類特征
2.多態的好處
假設我們目前有這樣的需求,給飼養員提供一個餵養動物的方法,用於餵養動物
沒有多態, 針對不同類型的動物,我們要提供不同的feed方法來餵食,非常繁瑣,不夠簡潔。
那怎樣才能只提供一個方法就可以統一餵養所有動物?
這就是多態的好處
把不同的子類對象當做父類類型來看待,可以屏蔽不同子類對象之間的實現差異,從而寫出通用的代碼的代碼達到通用編程,以適應需求的不同變化、
提高了代碼的擴展性
二、多態的轉型
1.向上轉型
l當有子類對象賦值給一個父類引用時,便是向上轉型,多態本身就是向上轉型的過程。
2.向下轉型
一個已經向上轉型的子類對象可以使用強制類型轉換的格式,將父類引用轉為子類引用,這個過程是向下轉型。如果是直接創建父類對象,是無法向下轉型的!
運行報錯,因為我們無法將貓轉換成狗
那什麽時候使用向上轉型呢?
當不需要面對子類類型時,通過提高擴展性,或者使用父類的功能就能完成相應的操作,這時就可以使用向上轉型。
如:Animal a = new Dog();
a.eat();
l什麽時候使用向下轉型?
當要使用子類特有功能時,就需要使用向下轉型。
如:Dog d = (Dog) a; //向下轉型
d.lookHome();//調用狗類的lookHome方法
l向下轉型的好處:可以使用子類特有功能。
弊端是:需要面對具體的子類對象;在向下轉型時容易發生ClassCastException類型轉換異常。
那怎麽解決這個弊端呢?
3.instanceof關鍵字
當發生以上這種情況時,我們就需要用到instance of這個關鍵字
instanceof 判斷對象是否是某一個類的實例
* 語法格式: boolean b= 對象A instance of 類B
* 判斷A對象是否是B對象的實例
Java基礎14-多態(思想、轉型、instanceof)