最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java多態(tài)實(shí)現(xiàn)原理詳細(xì)梳理總結(jié)

 更新時(shí)間:2022年06月15日 09:17:54   作者:? 共飲一杯無?  ?  
這篇文章主要介紹了Java多態(tài)實(shí)現(xiàn)原理詳細(xì)梳理總結(jié),多態(tài)是繼封裝、繼承之后,面向?qū)ο蟮牡谌筇匦?,本文只總結(jié)了多態(tài)的實(shí)現(xiàn)原理,需要的朋友可以參考一下

一、概述

引入

多態(tài)是繼封裝、繼承之后,面向?qū)ο蟮牡谌筇匦?。生活中,比如跑的動作,小貓、小狗和大象,跑起來是不一樣的。再比如飛的動作,昆蟲、鳥類和飛機(jī),飛起來也是不一樣的??梢?,同一行為,通過不同的事物,可以體現(xiàn)出來的不同的形態(tài)。多態(tài),描述的就是這樣的狀態(tài)。

定義

多態(tài): 是指同一行為,具有多個不同表現(xiàn)形式。

二、多態(tài)的體現(xiàn)

多態(tài)體現(xiàn)的格式:

父類類型 變量名 = new 子類對象;
變量名.方法名();

父類類型:指子類對象繼承的父類類型,或者實(shí)現(xiàn)的父接口類型。

代碼如下:

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

當(dāng)使用多態(tài)方式調(diào)用方法時(shí),首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,執(zhí)行的是子類重寫后方法。

代碼如下:

定義父類:

public abstract class Animal {
    public abstract void eat();
}

定義子類:

class Cat extends Animal {
    public void eat() {
        System.out.println("吃魚??");
    }
}
class Dog extends Animal {
    public void eat() {
        System.out.println("吃骨頭??");
    }
}

定義測試類:

public class Test {
    public static void main(String[] args) {
        // 多態(tài)形式,創(chuàng)建對象
        Animal a1 = new Cat();
        // 調(diào)用的是 Cat 的 eat
        a1.eat();
        // 多態(tài)形式,創(chuàng)建對象
        Animal a2 = new Dog();
        // 調(diào)用的是 Dog 的 eat
        a2.eat();
    }
}

三、多態(tài)的好處

實(shí)際開發(fā)的過程中,父類類型作為方法形式參數(shù),傳遞子類對象給方法,進(jìn)行方法的調(diào)用,更能體現(xiàn)出多態(tài)的擴(kuò)展性與便利

定義父類:

public abstract class Animal {
    public abstract void eat();
}

定義子類:

class Cat extends Animal {
    public void eat() {
        System.out.println("吃魚??");
    }
}
class Dog extends Animal {
    public void eat() {
        System.out.println("吃骨頭??");
    }
}

定義測試類:

public class Test {
    public static void main(String[] args) {
        // 多態(tài)形式,創(chuàng)建對象
        Cat c = new Cat();
        Dog d = new Dog();
        // 調(diào)用showCatEat
        showCatEat(c);
        // 調(diào)用showDogEat
        showDogEat(d);
        /**
        以上兩個方法, 均可以被showAnimalEat(Animal a)方法所替代
        而執(zhí)行效果一致
        */
        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();
    }
}

由于多態(tài)特性的支持,showAnimalEat方法的Animal類型,是Cat和Dog的父類類型,父類類型接收子類對象,當(dāng)然可以把Cat對象和Dog對象,傳遞給方法。
當(dāng)eat方法執(zhí)行時(shí),多態(tài)規(guī)定,執(zhí)行的是子類重寫的方法,那么效果自然與showCatEat、showDogEat方法一致,
所以showAnimalEat完全可以替代以上兩方法。
不僅僅是替代,在擴(kuò)展性方面,無論之后再多的子類出現(xiàn),我們都不需要編寫showXxxEat方法了,直接使用
showAnimalEat都可以完成。
所以,多態(tài)的好處,體現(xiàn)在,可以使程序編寫的更簡單,并有良好的擴(kuò)展。

四、引用類型轉(zhuǎn)換

多態(tài)的轉(zhuǎn)型分為向上轉(zhuǎn)型與向下轉(zhuǎn)型兩種:

向上轉(zhuǎn)型

向上轉(zhuǎn)型:多態(tài)本身是子類類型向父類類型向上轉(zhuǎn)換的過程,這個過程是默認(rèn)的。當(dāng)父類引用指向一個子類對象時(shí),便是向上轉(zhuǎn)型。

使用格式:

父類類型 變量名 = new 子類類型();
如:Animal a = new Cat();

向下轉(zhuǎn)型

向下轉(zhuǎn)型:父類類型向子類類型向下轉(zhuǎn)換的過程,這個過程是強(qiáng)制的。
一個已經(jīng)向上轉(zhuǎn)型的子類對象,將父類引用轉(zhuǎn)為子類引用,可以使用強(qiáng)制類型轉(zhuǎn)換的格式,便是向下轉(zhuǎn)型。

使用格式:

子類類型 變量名 = (子類類型) 父類變量名;
如:Cat c =(Cat) a;

為什么要轉(zhuǎn)型

當(dāng)使用多態(tài)方式調(diào)用方法時(shí),首先檢查父類中是否有該方法,如果沒有,則編譯錯誤。也就是說,不能調(diào)用子類擁有,而父類沒有的方法。編譯都錯誤,更別說運(yùn)行了。這也是多態(tài)給我們帶來的一點(diǎn)"小麻煩"。所以,想要調(diào)用子類特有的方法,必須做向下轉(zhuǎn)型。

轉(zhuǎn)型演示,代碼如下:

定義類:

abstract class Animal {
    abstract void eat();
}
class Cat extends Animal {
    public void eat() {
        System.out.println("吃魚??");
    }
    public void catchMouse() {
        System.out.println("抓老鼠??");
    }
}
class Dog extends Animal {
    public void eat() {
        System.out.println("吃骨頭??");
    }
    public void watchHouse() {
        System.out.println("看家??");
    }
}

定義測試類:

public static void main(String[] args) {
    // 向上轉(zhuǎn)型
    Animal a = new Cat();
    a.eat(); // 調(diào)用的是 Cat 的 eat
    // 向下轉(zhuǎn)型
    Cat c = (Cat)a;
    c.catchMouse(); // 調(diào)用的是 Cat 的 catchMouse
}

轉(zhuǎn)型的異常

轉(zhuǎn)型的過程中,一不小心就會遇到這樣的問題,請看如下代碼:

public class Test {
    public static void main(String[] args) {
        // 向上轉(zhuǎn)型
        Animal a = new Cat();
        a.eat(); // 調(diào)用的是 Cat 的 eat
        // 向下轉(zhuǎn)型
        Dog d = (Dog)a;
        d.watchHouse(); // 調(diào)用的是 Dog 的 watchHouse 【運(yùn)行報(bào)錯】
    }
}

這段代碼可以通過編譯,但是運(yùn)行時(shí),卻報(bào)出了 ClassCastException ,類型轉(zhuǎn)換異常!這是因?yàn)椋髅鲃?chuàng)建了Cat類型對象,運(yùn)行時(shí),當(dāng)然不能轉(zhuǎn)換成Dog對象的。這兩個類型并沒有任何繼承關(guān)系,不符合類型轉(zhuǎn)換的定義。為了避免ClassCastException的發(fā)生,Java提供了 instanceof 關(guān)鍵字,給引用變量做類型的校驗(yàn),格式如下:

變量名 instanceof 數(shù)據(jù)類型
如果變量屬于該數(shù)據(jù)類型,返回true。
如果變量不屬于該數(shù)據(jù)類型,返回false。

所以,轉(zhuǎn)換前,我們最好先做一個判斷,代碼如下:

public class Test {
    public static void main(String[] args) {
    // 向上轉(zhuǎn)型
        Animal a = new Cat();
        a.eat(); // 調(diào)用的是 Cat 的 eat
        // 向下轉(zhuǎn)型
        if (a instanceof Cat){
            Cat c = (Cat)a;
            c.catchMouse(); // 調(diào)用的是 Cat 的 catchMouse
        } else if (a instanceof Dog){
            Dog d = (Dog)a;
            d.watchHouse(); // 調(diào)用的是 Dog 的 watchHouse
        }
    }
}

到此這篇關(guān)于Java多態(tài)實(shí)現(xiàn)原理詳細(xì)梳理總結(jié)的文章就介紹到這了,更多相關(guān)Java 多態(tài)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于SpringBoot2.0版本與老版本的區(qū)別

    基于SpringBoot2.0版本與老版本的區(qū)別

    這篇文章主要介紹了SpringBoot2.0版本與老版本的區(qū)別,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java開發(fā)flyway的方法

    java開發(fā)flyway的方法

    這篇文章主要介紹了java開發(fā)flyway的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 基于java流實(shí)現(xiàn)壓縮圖片過程解析

    基于java流實(shí)現(xiàn)壓縮圖片過程解析

    這篇文章主要介紹了基于java流實(shí)現(xiàn)壓縮圖片過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 微服務(wù)鏈路追蹤Spring Cloud Sleuth整合Zipkin解析

    微服務(wù)鏈路追蹤Spring Cloud Sleuth整合Zipkin解析

    這篇文章主要為大家介紹了微服務(wù)鏈路追蹤Spring Cloud Sleuth整合Zipkin解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • SpringBoot異步任務(wù)實(shí)現(xiàn)下單校驗(yàn)庫存的項(xiàng)目實(shí)踐

    SpringBoot異步任務(wù)實(shí)現(xiàn)下單校驗(yàn)庫存的項(xiàng)目實(shí)踐

    在開發(fā)中,異步任務(wù)應(yīng)用的場景非常的廣泛,本文主要介紹了SpringBoot異步任務(wù)實(shí)現(xiàn)下單校驗(yàn)庫存的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • java實(shí)現(xiàn)的RC4加密解密算法示例

    java實(shí)現(xiàn)的RC4加密解密算法示例

    這篇文章主要介紹了java實(shí)現(xiàn)的RC4加密解密算法,結(jié)合具體實(shí)例形式分析了java RC4加密解密算法的實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下
    2017-06-06
  • MyBatis Generator 自定義生成注釋的方法

    MyBatis Generator 自定義生成注釋的方法

    這篇文章主要介紹了MyBatis Generator 自定義生成注釋的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • java創(chuàng)建線程的兩種方法區(qū)別

    java創(chuàng)建線程的兩種方法區(qū)別

    這篇文章主要為大家區(qū)分了java創(chuàng)建線程的兩種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 詳解如何使用maven生成可以執(zhí)行的jar

    詳解如何使用maven生成可以執(zhí)行的jar

    這篇文章主要介紹了詳解如何使用maven生成可以執(zhí)行的jar,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Spring中HandlerMethod類源碼詳細(xì)解析

    Spring中HandlerMethod類源碼詳細(xì)解析

    這篇文章主要介紹了Spring中HandlerMethod類源碼詳細(xì)解析,HandlerMethod類用于封裝控制器方法信息,包含類信息、方法Method對象、參數(shù)、注解等信息,具體的接口請求是可以根據(jù)封裝的信息調(diào)用具體的方法來執(zhí)行業(yè)務(wù)邏輯,需要的朋友可以參考下
    2023-11-11

最新評論

牡丹江市| 建德市| 东台市| 株洲市| 维西| 吐鲁番市| 朝阳县| 榆树市| 乌什县| 巩义市| 化德县| 宜川县| 荣成市| 手游| 白玉县| 武义县| 鸡泽县| 香河县| 洛阳市| 宣武区| 九寨沟县| 克什克腾旗| 无棣县| 绍兴县| 平乡县| 信宜市| 饶河县| 台江县| 淅川县| 繁峙县| 平罗县| 江口县| 陈巴尔虎旗| 高台县| 镇原县| 云龙县| 金沙县| 江安县| 哈巴河县| 轮台县| 璧山县|