首頁 >Java >Java入門 >java物件導向-多態的詳細介紹

java物件導向-多態的詳細介紹

王林
王林轉載
2019-11-30 14:21:333064瀏覽

java物件導向-多態的詳細介紹

一、概述​​

多態是繼封裝、繼承之後,物件導向的第三大特性。

生活中,例如跑步的動作,小貓、小狗和大象,跑起來是不一樣的。再例如飛的動作,昆蟲、鳥類和飛機,飛起來也是不一樣的。可見,同一行為,透過不同的事物,可以體現出來的不同的形態。多態,描述的就是這樣的狀態。

多態:

是指相同行為,具有多個不同表現形式。

前提【重點】

1.繼承或實作【二選一】

2.方法的重寫【意義體現:不重寫寫,無意義】

3.父類別引用指向子類別物件【格式體現】

免費線上學習影片推薦:java影片

#二、多態的體現

多型體現的格式:

父类类型 变量名 = new 子类对象; 
变量名.方法名();

父類別類型:指子類別物件繼承的父類別類型,或是實現的父接口類型。

程式碼如下:

Fu f = new Zi(); 
f.method();

當使用多態方式呼叫方法時,首先檢查父類別中是否有該方法,如果沒有,則編譯錯誤;如果有,執行的是子類別重寫後方法。

程式碼如下:

定義父類別:

java物件導向-多態的詳細介紹

#定義子類別:

java物件導向-多態的詳細介紹

定義測試類別:

java物件導向-多態的詳細介紹

三、多態的好處

實際開發的過程中,父類別作為方法形式參數,傳遞子類別物件給方法,進行方法的調用,更能體現出多態的擴展性與便利性。

程式碼如下:

定義父類別:

java物件導向-多態的詳細介紹

#定義子類別:

java物件導向-多態的詳細介紹

定義測試類別:

public class Test {
    public static void main(String[] args) {
        // 多态形式,创建对象
        // Cat c = new Cat();
        // Dog d = new Dog();

        // 调用showCatEat showCatEat(c);
        // 调用showDogEat
        showDogEat(d);

        /*
        以上两个方法, 均可以被showAnimalEat(Animal a)方法所替代而执行效果一致
        */
        showAnimalEat(c);
        showAnimalEat(d);
    }

    public static void showCatEat(Cat c) {
        c.eat();
    }

    public static void showDogEat(Dog d) {
        d.eat();
    }

    public static void showAnimalEat(Animal a) {
        a.eat();
    }
}

當eat方法執行時,多型規定執行的是子類別重寫的方法,那麼效果自然與showCatEat、showDogEat方法一致, 所以showAnimalEat完全可以取代以上兩方法。

不只是替代,在擴充性方面,無論之後再多的子類別出現,我們都不需要寫showXxxEat方法了,直接使用showAnimalEat都可以完成。

所以,多態的好處體現在可以讓程式編寫的更簡單,並且有良好的擴充。

四、引用型別轉換

多型態的轉型分為向轉型與向下轉型兩種:

#向上轉型

向轉型:多型態本身就是子類別類型向父類別類型向上轉換的過程,這個過程是預設的。

當父類別引用指向子類別物件時,便是向上轉型。

使用格式:

父类类型 变量名 = new 子类类型(); 
如:Animal a = new Cat();

向下轉型

#父類別類型向子類別類型向下轉換的過程,這個過程是強制的。

一個已經向上轉型的子類對象,將父類引用轉為子類引用,可以使用強制型別轉換的格式,便是向下轉型。

使用格式:

子类类型 变量名 = (子类类型) 父类变量名; 
如 :Cat c =(Cat) a;

轉型演示,程式碼如下:

定義類別:

java物件導向-多態的詳細介紹

定義測試類別:

java物件導向-多態的詳細介紹

轉型的異常

转型的过程中,一不小心就会遇到这样的问题,请看如下代码:

java物件導向-多態的詳細介紹

这段代码可以通过编译,但是运行时,却报出了ClassCastException,类型转换异常!这是因为,明明创建了Cat类型对象,运行时,当然不能转换成Dog对象的。这两个类型并没有任何继承关系,不符合类型转换的定义。

为了避免ClassCastException的发生,Java提供了 关键字,给引用变量做类型的校验。

格式如下:

变量名 instanceof 数据类型
如果变量属于该数据类型,返回true。
如果变量不属于该数据类型,返回false。

所以,转换前,我们最好先做一个判断,代码如下:

java物件導向-多態的詳細介紹

想学习更多相关教程请访问:java入门学习

以上是java物件導向-多態的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除