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

學(xué)習(xí)Java之如何正確地向上轉(zhuǎn)型與向下轉(zhuǎn)型

 更新時間:2023年05月10日 09:35:45   作者:一一哥Sun  
面向?qū)ο蟮牡谌齻€特征是多態(tài),實現(xiàn)多態(tài)有三個必要條件:繼承、方法重寫和向上轉(zhuǎn)型,在學(xué)習(xí)多態(tài)之前,我們還要先學(xué)習(xí)Java的類型轉(zhuǎn)換,本篇文章就來帶大家認識什么是類型轉(zhuǎn)換,看看類型轉(zhuǎn)換都有哪幾種情況,以及如何避免類型轉(zhuǎn)換時出現(xiàn)異常

一. 類型轉(zhuǎn)型

將一個類型轉(zhuǎn)換成另一個類型的過程被稱為類型轉(zhuǎn)換。 我們所說的對象類型轉(zhuǎn)換,一般是指兩個存在繼承關(guān)系的對象,而不是任意類型的對象。如果兩個類型之間沒有繼承關(guān)系,就不允許進行類型轉(zhuǎn)換,否則會拋出強制類型轉(zhuǎn)換異常(java.lang.ClassCastException)。
Java語言允許某個類型的引用變量引用子類的實例,而且可以對這個引用變量進行類型轉(zhuǎn)換。Java中引用類型之間的類型轉(zhuǎn)換(前提是兩個類是直接或間接的父子關(guān)系)主要有兩種,分別是向上轉(zhuǎn)型(upcasting)和向下轉(zhuǎn)型(downcasting) 。

我們先來看下面這張圖:

貓、狗、牛、羊都是動物,所以”動物“是父類,貓狗牛羊是具體的子類。我們可以說貓是動物,狗是動物,牛是動物,羊是動物,這個結(jié)論肯定沒錯!但如果我們說,動物是貓,動物是狗,動物是牛,動物是羊,這個結(jié)論一定正確嗎?那可就不一定了。子類肯定符合父類類型,但反之,父類不一定符合子類類型!

接下來分別對向上轉(zhuǎn)型和向下轉(zhuǎn)型進行講解。

二. 向上轉(zhuǎn)型

1. 概念

所謂的向上轉(zhuǎn)型,就是父類引用指向子類的對象,也就是把子類對象直接賦給父類引用變量,此時不用強制轉(zhuǎn)換。比如我們說貓是動物,狗是動物,牛是動物,羊是動物,這就是把子類當(dāng)成父類來用。父類是子類的上級,我們直接把子類向上提拔轉(zhuǎn)型了。

2. 特點

向上轉(zhuǎn)型具有如下特點:

  • 編譯類型取決于=號左邊,運行類型取決于=號右邊;
  • 子類可以調(diào)用父類的所有成員,但需遵守訪問權(quán)限;
  • 父類不能調(diào)用子類的特有成員;
  • 最終的運行效果取決于子類的具體實現(xiàn)。

3. 語法

向上轉(zhuǎn)型的基本語法如下所示:

//左側(cè)是父類引用變量,右側(cè)是創(chuàng)建的子類對象,我們可以把它當(dāng)作父類使用

父類類型 引用名 = new 子類類型();

4. 案例

接下來我們通過一個案例來演示向上轉(zhuǎn)型該如何實現(xiàn)。

/**
 * @author 一一哥Sun 
 * 定義父類---向上與向下轉(zhuǎn)型
 */
public interface Animal {
    //叫
    public void speak();
}

//Dog類實現(xiàn)Animal接口
public class Dog implements Animal {
    @Override
    public void speak() {
	System.out.println("狗子:汪汪");
    }
}

//Cat類實現(xiàn)Animal接口
public class Cat implements Animal {
    @Override
    public void speak() {
	System.out.println("貓子:喵喵");
    }
}

//定義一個測試類
public class AnimalTest {
    public static void main(String[] args) {
	//向上轉(zhuǎn)型
	//父類引用dog變量,指向子類對象new Dog();
        //動物 = 狗;以下代碼的意思就是”狗是動物“
	Animal dog=new Dog();
        //向上轉(zhuǎn)型后,可以使用父類Animal中的屬性和方法。
	dog.speak();

	//Animal animal=new Cat();效果等同于如下兩行代碼:
	Cat cat=new Cat();
	Animal animal=cat;
	animal.speak();
    }
}

我們在進行向上轉(zhuǎn)型時,可以寫成Animal animal=new Cat(); Animal animal=cat;的形式。就是先創(chuàng)建出cat對象,然后再將cat對象賦值給Animal類型的變量,這樣就實現(xiàn)了向上轉(zhuǎn)型。因為Animal是父級類型,Cat是子級類型,Cat是Animal的子類,所以可以直接將cat變量賦值給animal,這就是向上轉(zhuǎn)型。但這種寫法比較繁瑣,我們通常是直接采用Animal cat=new Cat();的形式,簡潔明了。

我們之所以可以實現(xiàn)向上轉(zhuǎn)型,主要是因為兩個類型之間是父子關(guān)系。比如在本例中,向上轉(zhuǎn)型就等于說”貓是動物,狗是動物“,因為貓狗都是動物的子類,所以這個結(jié)論是確定無誤的。

三. 向下轉(zhuǎn)型

1. 概念

向下轉(zhuǎn)型則反之,也就是一個已經(jīng)向上轉(zhuǎn)型的子類對象指向父類引用。 向下轉(zhuǎn)型后,可以調(diào)用子類類型中所有的成員。向下轉(zhuǎn)型時,必須進行強制類型轉(zhuǎn)換。因為父類擁有的成員,子類肯定會有,但子類擁有的成員,父類不一定有。

但要注意,如果父類的引用對象指向的是子類對象,則向下轉(zhuǎn)型時是安全的,即編譯時不會出現(xiàn)錯誤。但如果父類的引用對象是父類本身,那么在向下轉(zhuǎn)型的過程中是不安全的,雖然編譯時不會出錯,但在運行過程中會出現(xiàn)強制類型轉(zhuǎn)換異常。我們可以使用instanceof運算符來避免出現(xiàn)強制類型轉(zhuǎn)換異常。

2. 特點

向下轉(zhuǎn)型具有如下特點:

  • 只能強制轉(zhuǎn)換父類的引用,不能強制轉(zhuǎn)換父類的對象;
  • 父類的引用必須指向子類目標類型的對象;
  • 向下轉(zhuǎn)型后,父類可以調(diào)用子類類型中的所有成員。

3. 語法

向下轉(zhuǎn)型的基本語法如下所示:

//向下轉(zhuǎn)型使用強制類型轉(zhuǎn)換的格式,將父類引用類型轉(zhuǎn)換為子類引用類型

子類類型 引用名 = (子類類型) 父類引用;

4. 案例

接下來我們在上面的案例基礎(chǔ)之上,對代碼進行改造,在Cat類中增加一個新的方法。

public class Cat implements Animal {
    @Override
    public void speak() {
	System.out.println("貓子:喵喵");
    }

    //給其他動物打招呼
    public void helloAnimal(Animal animal) {
	//向下轉(zhuǎn)型,將父類型轉(zhuǎn)為子類型。
	//此時有可能會出現(xiàn)ClassCastException類型轉(zhuǎn)換異常,因為子類一定屬于父類的一員,但父類不一定屬于子類。
	//我們說“貓是動物”一定沒問題,但如果說“動物是貓”,這個結(jié)論未必正確。所以把“動物強轉(zhuǎn)成貓”的過程中,有可能會出現(xiàn)異常。
	//只有兩者之間具有明確的父子關(guān)系時才能進行強轉(zhuǎn),否則就會出現(xiàn)類型轉(zhuǎn)換異常。
		
	//向下轉(zhuǎn)型時需要進行類型強轉(zhuǎn)
	Cat cat=(Cat) animal;
        //向下轉(zhuǎn)型后,可以使用子類Cat中的屬性和方法。
	cat.speak();
    }
}

//測試類
public class AnimalTest {
    public static void main(String[] args) {
	Animal animal=new Cat();
	animal.speak();
		
	Cat cat=new Cat();
        //這里我們傳參時,既可以傳遞animal,也可以傳遞cat,但不能傳遞dog類型,否則會出現(xiàn)java.lang.ClassCastException: 
	//因為class com.yyg.convert.Dog cannot be cast to class com.yyg.convert.Cat。狗不能被轉(zhuǎn)成貓
	//cat2.helloAnimal(dog);
	cat.helloAnimal(animal);

        //Dog dog = new Dog();
	//這里就會編譯出錯,不允許把Dog對象類型轉(zhuǎn)換成Cat對象類型
	//Cat cat = (Cat)dog;    
    }
}

向下轉(zhuǎn)型就是將父類型轉(zhuǎn)為子類型,但要注意,此時有可能會出現(xiàn)ClassCastException類型轉(zhuǎn)換異常,因為子類一定屬于父類的一員,但父類不一定屬于子類。我們說“貓是動物”一定沒問題,但如果說“動物是貓”,這個結(jié)論未必正確。所以把“動物強轉(zhuǎn)成貓”的過程中,有可能會出現(xiàn)異常。只有兩者之間具有明確的父子關(guān)系時才能進行強轉(zhuǎn),否則就會出現(xiàn)類型轉(zhuǎn)換異常。

就比如上面的案例中,我們傳參時,既可以傳遞animal,也可以傳遞cat,但不能傳遞dog類型,否則會出現(xiàn)java.lang.ClassCastException,因為class com.yyg.convert.Dog cannot be cast to class com.yyg.convert.Cat,狗類不能被轉(zhuǎn)成貓類。

四. 結(jié)語

至此,就把類型轉(zhuǎn)換給大家介紹完了,我們來看看類型轉(zhuǎn)換的要點吧::

  • 向上轉(zhuǎn)型是父類引用指向子類的對象,不必強制類型轉(zhuǎn)換 ;
  • 向下轉(zhuǎn)型是子類對象指向父類引用,必須進行強制類型轉(zhuǎn)換;
  • 可以強制向下轉(zhuǎn)型最好借助instanceOf進行類型判斷;

以上就是學(xué)習(xí)Java之如何正確地向上轉(zhuǎn)型與向下轉(zhuǎn)型的詳細內(nèi)容,更多關(guān)于Java向上轉(zhuǎn)型與向下轉(zhuǎn)型的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java SerialVersionUID作用詳解

    Java SerialVersionUID作用詳解

    這篇文章主要介紹了Java SerialVersionUID作用詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • MyBatis-Plus自動化填充的踩坑記錄及解決

    MyBatis-Plus自動化填充的踩坑記錄及解決

    這篇文章主要介紹了MyBatis-Plus自動化填充的踩坑記錄及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 解決fastjson從1.1.41升級到1.2.28后報錯問題詳解

    解決fastjson從1.1.41升級到1.2.28后報錯問題詳解

    這篇文章主要介紹了解決fastjson從1.1.41升級到1.2.28后報錯問題詳解,需要的朋友可以參考下
    2020-02-02
  • Java倒計時三種實現(xiàn)方式代碼實例

    Java倒計時三種實現(xiàn)方式代碼實例

    這篇文章主要介紹了Java倒計時三種實現(xiàn)方式代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • java 字符串轉(zhuǎn)化為字符數(shù)組的3種實現(xiàn)案例

    java 字符串轉(zhuǎn)化為字符數(shù)組的3種實現(xiàn)案例

    這篇文章主要介紹了java 字符串轉(zhuǎn)化為字符數(shù)組的3種實現(xiàn)案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Java用數(shù)組實現(xiàn)循環(huán)隊列的示例

    Java用數(shù)組實現(xiàn)循環(huán)隊列的示例

    下面小編就為大家?guī)硪黄狫ava用數(shù)組實現(xiàn)循環(huán)隊列的示例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • JavaWeb簡單用戶登錄注冊實例代碼(有驗證碼)

    JavaWeb簡單用戶登錄注冊實例代碼(有驗證碼)

    這篇文章主要介紹了JavaWeb簡單用戶登錄注冊實例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Spring Security獲取用戶認證信息的實現(xiàn)流程

    Spring Security獲取用戶認證信息的實現(xiàn)流程

    Spring Security是一個能夠為基于Spring的企業(yè)應(yīng)用系統(tǒng)提供聲明式的安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應(yīng)用上下文中配置的Bean,充分利用了Spring IoC,DI和AOP功能,為應(yīng)用系統(tǒng)提供聲明式的安全訪問控制功能
    2022-12-12
  • 詳解SpringBoot2 使用Spring Session集群

    詳解SpringBoot2 使用Spring Session集群

    這篇文章主要介紹了SpringBoot2 使用Spring Session集群,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-04-04
  • Spring應(yīng)用中使用acutator/refresh刷新屬性不生效的問題分析及解決

    Spring應(yīng)用中使用acutator/refresh刷新屬性不生效的問題分析及解決

    在Spring應(yīng)用收到/actuator/refresh的POST請求后,標注了@RefreshScope以及@ConfiguratioinProperties的bean會被Spring容器重新加載,但是,在實際應(yīng)用中,并沒有按照預(yù)期被Spring容器加載,本文將討論導(dǎo)致這種未按預(yù)期刷新的一種原因,感興趣的朋友可以參考下
    2024-01-01

最新評論

颍上县| 西林县| 两当县| 夏津县| 都匀市| 蒙山县| 新兴县| 福清市| 临汾市| 灵台县| 武宣县| 台山市| 五大连池市| 永仁县| 岳阳县| 泊头市| 昭平县| 阿拉善盟| 阿克陶县| 淳化县| 霍山县| 腾冲县| 永济市| 榕江县| 沁源县| 开平市| 库车县| 崇义县| 米易县| 五寨县| 江山市| 和平县| 普兰县| 梅河口市| 胶南市| 田林县| 班玛县| 乌兰察布市| 黔西县| 裕民县| 延边|