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

Java多態(tài)中的向上轉(zhuǎn)型與向下轉(zhuǎn)型淺析

 更新時(shí)間:2023年02月16日 09:58:19   作者:烽起黎明  
多態(tài)是指不同類的對(duì)象在調(diào)用同一個(gè)方法是所呈現(xiàn)出的多種不同行為,下面這篇文章主要給大家介紹了關(guān)于Java多態(tài)中向上轉(zhuǎn)型與向下轉(zhuǎn)型的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

向上轉(zhuǎn)型

概念明細(xì)

【原理】:實(shí)際就是創(chuàng)建一個(gè)子類對(duì)象,將其當(dāng)成父類對(duì)象來(lái)使用.

語(yǔ)法格式:父類類型 對(duì)象名 = new 子類類型()

Animal animal = new Cat("元寶",2);	
//animal是父類類型,但可以引用一個(gè)子類對(duì)象,因?yàn)槭菑男》秶虼蠓秶霓D(zhuǎn)換

以下是定義的父類Animal類它的兩個(gè)繼承類Cat類和Dog類,分別重寫了Animal類的eat()方法

class Animal{
     String name;
     int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat(){
        System.out.println(age + "歲的" + name + "正在吃東西");
    }
}

class Cat extends Animal {
    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(age + "歲的" + name + "正在吃貓糧");
    }
}

class Dog extends Animal {
    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(age + "歲的" + name + "正在吃狗糧");
    }
}

使用場(chǎng)景1:直接賦值

以下這種就是直接賦值類型的向上轉(zhuǎn)型,將子類對(duì)象的引用給到父類對(duì)象。然后再將這個(gè)對(duì)象作為參數(shù)傳遞進(jìn)去,就可以根據(jù)不同引用調(diào)用不同的行為

public class Test1 {
    public static void eat(Animal animal)
    {
        animal.eat();
    }
    public static void main(String[] args) {
        Animal animal1 = new Animal("動(dòng)物",3);
        Animal animal2 = new Cat("加菲貓",2);
        Animal animal3 = new Dog("哈士奇",1);
        
        eat(animal1);
        eat(animal2);
        eat(animal3);
    }
}

使用場(chǎng)景2:

方法傳參 第二種方法傳參很簡(jiǎn)單,我們連對(duì)象都不需要?jiǎng)?chuàng)建,只需要直接將三種不同對(duì)象的引用作為實(shí)參傳遞給到eat()中的形參接受,就可以產(chǎn)生【向上轉(zhuǎn)型】

public class Test1 {
    public static void eat(Animal animal)
    {
        animal.eat();
    }
    public static void main(String[] args) {
        eat(new Animal("動(dòng)物",3));
        eat(new Cat("加菲貓",2));
        eat(new Dog("哈士奇",1));
    }
}

使用場(chǎng)景3:

方法返回 第三種便是在一個(gè)方法中將不同對(duì)象的引用進(jìn)行返回,然后傳遞給到父類對(duì)象,也可以產(chǎn)生向上轉(zhuǎn)型

public static void eat(Animal animal)
{
    animal.eat();
}

稍微講一下這個(gè)方法,可以看到形參是String字符類型,在方法中通過(guò)判斷外界傳入進(jìn)來(lái)的字符串然后對(duì)應(yīng)地進(jìn)行返回

  •  若是“貓”就返Cat對(duì)象的引用;
  •  若是“狗”就返Dog對(duì)象的引用;
  •  若是其他就返null
public static Animal BuyAnimal(String var)
{
    if(var.equals("貓")){
        return new Cat("加菲貓",2);
    }else if(var.equals("狗")){
        return new Dog("哈士奇",1);
    }else{
        return null;
    }
}
Animal animal1 = BuyAnimal("貓");
eat(animal1);
Animal animal2 = BuyAnimal("狗");
eat(animal2);
Animal animal3 = BuyAnimal("兔");
eat(animal3);

然后可以看到,前兩個(gè)傳入的是【貓】和【狗】,因此執(zhí)行的便是不同對(duì)象的行為,但是在最后傳入了【兔】,因此在BuyAnimal()方法中會(huì)return null

這就使得傳入eat()方法中去調(diào)用相關(guān)對(duì)象的行為時(shí)因?yàn)椴淮嬖谶@個(gè)對(duì)象的引用,所以就會(huì)產(chǎn)生空指針異常

上述便是向上轉(zhuǎn)型的三種場(chǎng)景。學(xué)會(huì)辨別和使用即可

向上轉(zhuǎn)型的優(yōu)缺點(diǎn)

【優(yōu)點(diǎn)】:讓代碼實(shí)現(xiàn)更簡(jiǎn)單靈活,這個(gè)從上面的三個(gè)不同場(chǎng)景就可以看得出來(lái)

【缺點(diǎn)】:不能調(diào)用到子類特有的方法??

比如說(shuō)我在Dog類中寫了一個(gè)它自己獨(dú)有的方法lookdoor()

class Dog extends Animal {
    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(age + "歲的" + name + "正在吃狗糧");
    }

    public void lookdoor(){
        System.out.println(name + "在看門");
    }
}

但是可以看到,我在通過(guò)向上轉(zhuǎn)型之后通過(guò)父類對(duì)象接受子類引用但是調(diào)用不到子類中特有的方法,這其實(shí)就是向上轉(zhuǎn)型的缺陷

【注意事項(xiàng)】

  • 上轉(zhuǎn)型對(duì)象不可以訪問(wèn)子類新增的成員變量和子類自己新增的方法,因?yàn)檫@是子類獨(dú)有的,而父類中沒(méi)有
  • 上轉(zhuǎn)型對(duì)象可以訪問(wèn)子類繼承的方法或者是子類重寫的方法,這個(gè)時(shí)候當(dāng)上轉(zhuǎn)型對(duì)象去調(diào)用這個(gè)方法時(shí),一定是調(diào)用了子類重寫后的方法,這就是我們前面在講繼承的時(shí)候所提到的方法重寫
  • 不可以將父類創(chuàng)建的對(duì)象的引用賦值給子類聲明的對(duì)象,也就是下面的這兩句代碼,這很明顯和我們的上轉(zhuǎn)型對(duì)象相反的,我們是將子類對(duì)象給到父類的引用,但這是將父類的引用給到子類的對(duì)象,完全就是顛倒黑白【就和貓是動(dòng)物,動(dòng)物卻不是貓??一個(gè)道理】

向下轉(zhuǎn)型

接下去我們來(lái)講講向下轉(zhuǎn)型,這種類型的轉(zhuǎn)化不太安全,如果沒(méi)有特殊需求,不建議使用

向下轉(zhuǎn)型解決【調(diào)用子類獨(dú)有方法】

繼續(xù)上面的談到的在向上轉(zhuǎn)型之后無(wú)法調(diào)用子類獨(dú)有的方法這個(gè)問(wèn)題,其實(shí)向下轉(zhuǎn)型就可以解決,代碼如下

Animal animal1 = new Dog("哈士奇",1);
animal1.eat();
//animal1.lookdoor();
Dog dog = (Dog) animal1;
dog.lookdoor();

可以看到,也就是將父類的對(duì)象animal強(qiáng)轉(zhuǎn)成為Dog狗類的對(duì)象,這樣的話其實(shí)就可以去調(diào)用子類中特有的方法了

向下轉(zhuǎn)型的缺陷

那為什么說(shuō)向下轉(zhuǎn)型不安全呢,因?yàn)樗嬖诎踩[患

Animal animal1 = new Cat("加菲貓",2);
animal1.eat();
//animal1.lookdoor();
Dog dog = (Dog) animal1;
dog.lookdoor();

可以看到我將原先的Dog狗類變?yōu)榱?code>Cat貓類,此時(shí)animal就得到了貓類對(duì)象的引用,但是在下面可以看到如果將這個(gè)animal強(qiáng)轉(zhuǎn)為Dog狗類的對(duì)象其實(shí)就會(huì)出問(wèn)題了

看到編譯器報(bào)出了ClassCastException —— 類型轉(zhuǎn)換異常

向下轉(zhuǎn)型的優(yōu)化

??向下轉(zhuǎn)型用的比較少,而且不安全,萬(wàn)一轉(zhuǎn)換失敗,運(yùn)行時(shí)就會(huì)拋異常。

??Java中為了提高向下轉(zhuǎn)型的安全性,引入了 instanceof ,如果該表達(dá)式為true,則可以安全轉(zhuǎn)換

可以看到,在進(jìn)行強(qiáng)轉(zhuǎn)之前我通過(guò)instanceof這個(gè)關(guān)鍵字進(jìn)行了一下判斷,看看animal1是否獲取到了Dog類的引用,若是才可以進(jìn)行強(qiáng)制類型轉(zhuǎn)化,若不是的話就不會(huì)進(jìn)行任何操作

Animal animal1 = new Cat("加菲貓",2);
animal1.eat();
//animal1.lookdoor();
if(animal1 instanceof Dog){   //判斷一下animal1是否獲取到了Dog類的引用
  Dog dog = (Dog) animal1;
  dog.lookdoor();
}

如果對(duì)instance關(guān)鍵字感興趣的可以看看官方的文檔 ——> instanceof關(guān)鍵字

再度對(duì)比二者【碎碎念】

可能在上面這一系列說(shuō)來(lái)有點(diǎn)難分辨,我們?cè)賮?lái)對(duì)比看看

其實(shí)你可以這么去想Animal animal1 = new Cat可以看成是貓歸屬于一個(gè)動(dòng)物類,那貓一定是屬于動(dòng)物的

但是看到Dog dog = (Dog) animal1其實(shí)就要去思考把動(dòng)物歸屬于狗,這其實(shí)是說(shuō)不通的,難道只要是動(dòng)物就一定是狗嗎?那可不一定,動(dòng)物可多的是

總結(jié)與提煉

來(lái)總結(jié)一下本文所學(xué)到的內(nèi)容

  • 在本文中我們講到了多態(tài)中的【向上轉(zhuǎn)型】與【向下轉(zhuǎn)型】
  • 首先是說(shuō)到了向上轉(zhuǎn)型,介紹了它會(huì)出現(xiàn)的三種場(chǎng)景,也分析了它的優(yōu)缺點(diǎn),知道了在向下轉(zhuǎn)型之后無(wú)法調(diào)用子類特有的方法
  • 但是在向下轉(zhuǎn)型中,我們解決了這個(gè)問(wèn)題,通過(guò)對(duì)父類對(duì)象進(jìn)行一個(gè)強(qiáng)轉(zhuǎn),就可以調(diào)用到子類當(dāng)中的方法,不過(guò)可以看到這種做法不太安全,若是一開(kāi)始父類對(duì)象接受了一個(gè)子類的引用,但是在強(qiáng)轉(zhuǎn)的時(shí)候轉(zhuǎn)化為了另外一個(gè)子類,就會(huì)造成類型轉(zhuǎn)換的問(wèn)題
  • 于是后面對(duì)方法進(jìn)行了修正,在前面加上了instanceof關(guān)鍵字進(jìn)行一個(gè)判斷,只有父類接收到了這個(gè)子類的引用,才可以強(qiáng)轉(zhuǎn)為這個(gè)子類的對(duì)象

到此這篇關(guān)于Java多態(tài)中的向上轉(zhuǎn)型與向下轉(zhuǎn)型的文章就介紹到這了,更多相關(guān)Java多態(tài)向上轉(zhuǎn)型與向下轉(zhuǎn)型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于feign對(duì)x-www-form-urlencode類型的encode和decode問(wèn)題

    關(guān)于feign對(duì)x-www-form-urlencode類型的encode和decode問(wèn)題

    這篇文章主要介紹了關(guān)于feign對(duì)x-www-form-urlencode類型的encode和decode問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java 多態(tài)與抽象類詳解總結(jié)

    java 多態(tài)與抽象類詳解總結(jié)

    在面向?qū)ο蟮母拍钪校械膶?duì)象都是通過(guò)類來(lái)描繪的,但是反過(guò)來(lái),并不是所有的類都是用來(lái)描繪對(duì)象的,如果一個(gè)類中沒(méi)有包含足夠的信息來(lái)描繪一個(gè)具體的對(duì)象,這樣的類就是抽象類,而多態(tài)是同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力
    2021-11-11
  • java FileWriter 追加文件及文件改名方式

    java FileWriter 追加文件及文件改名方式

    這篇文章主要介紹了java FileWriter 追加文件及文件改名的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 基于java中反射的總結(jié)分析

    基于java中反射的總結(jié)分析

    所謂反射,就是根據(jù)一個(gè)已經(jīng)實(shí)例化了的對(duì)象來(lái)還原類的完整信息
    至少對(duì)我而言,我認(rèn)為它帶給我的好處是,讓我從下往上的又了解了一遍面向?qū)ο?/P>

    2013-05-05
  • SpringBoot定義Bean的幾種實(shí)現(xiàn)方式

    SpringBoot定義Bean的幾種實(shí)現(xiàn)方式

    本文主要介紹了SpringBoot定義Bean的幾種實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • POI導(dǎo)出Excel報(bào)錯(cuò)No such file or directory的解決方法

    POI導(dǎo)出Excel報(bào)錯(cuò)No such file or directory的解決方法

    這篇文章主要為大家詳細(xì)介紹了POI導(dǎo)出Excel報(bào)錯(cuò)No such file or directory的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • springboot中如何去整合shrio實(shí)例分享

    springboot中如何去整合shrio實(shí)例分享

    這篇文章主要介紹了springboot中如何去整合shrio實(shí)例分享的相關(guān)資料,需要的朋友可以參考下
    2023-08-08
  • JAVA線程池原理實(shí)例詳解

    JAVA線程池原理實(shí)例詳解

    這篇文章主要介紹了JAVA線程池原理,結(jié)合實(shí)例形式詳細(xì)分析了java線程池概念、原理、創(chuàng)建、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2019-03-03
  • java?http請(qǐng)求獲取圖片并返回文件流給前端的方法步驟

    java?http請(qǐng)求獲取圖片并返回文件流給前端的方法步驟

    作為一名Java后端開(kāi)發(fā)者,掌握如何從后端返回文件流至前端是基本技能之一,這篇文章主要介紹了java?http請(qǐng)求獲取圖片并返回文件流給前端的方法步驟,需要的朋友可以參考下
    2024-09-09
  • 使用maven自定義插件開(kāi)發(fā)

    使用maven自定義插件開(kāi)發(fā)

    這篇文章主要介紹了使用maven自定義插件開(kāi)發(fā),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評(píng)論

绥中县| 板桥市| 泾川县| 皋兰县| 宁晋县| 平泉县| 江阴市| 郁南县| 阜新| 湖南省| 乌兰浩特市| 天镇县| 衡阳市| 班玛县| 房产| 铁岭市| 西昌市| 永川市| 紫阳县| 华池县| 保康县| 柘城县| 新宁县| 桐柏县| 靖州| 紫云| 榕江县| 福贡县| 清远市| 永胜县| 涞水县| 桂平市| 江陵县| 绥阳县| 博白县| 锦屏县| 游戏| 通化市| 高雄市| 龙门县| 方山县|