1. 程式人生 > >Java基礎14-多態(思想、轉型、instanceof)

Java基礎14-多態(思想、轉型、instanceof)

是否 實現類 無法 eof 便是 分享 AI 來看 什麽是

一、什麽是多態?

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)