欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 向上轉(zhuǎn)型和向下轉(zhuǎn)型的詳解

 更新時(shí)間:2021年12月22日 11:48:05   投稿:lqh  
這篇文章主要介紹了 Java 向上轉(zhuǎn)型和向下轉(zhuǎn)型的詳解的相關(guān)資料,需要的朋友可以參考下

?Java 向上轉(zhuǎn)型和向下轉(zhuǎn)型的詳解

轉(zhuǎn)型是在繼承的基礎(chǔ)上而言的,繼承是面向?qū)ο笳Z(yǔ)言中,代碼復(fù)用的一種機(jī)制,通過(guò)繼承,子類可以復(fù)用父類的功能,如果父類不能滿足當(dāng)前子類的需求,則子類可以重寫(xiě)父類中的方法來(lái)加以擴(kuò)展。

向上轉(zhuǎn)型:子類引用的對(duì)象轉(zhuǎn)換為父類類型稱為向上轉(zhuǎn)型。通俗地說(shuō)就是是將子類對(duì)象轉(zhuǎn)為父類對(duì)象。此處父類對(duì)象可以是接口

向下轉(zhuǎn)型:父類引用的對(duì)象轉(zhuǎn)換為子類類型稱為向下轉(zhuǎn)型。

前者是一個(gè)向上轉(zhuǎn)型,Animal dog 引用指向new Dog();子類對(duì)象當(dāng)成父類對(duì)象,只能調(diào)用父類的成員,如果子類重寫(xiě)了父類的方法就根據(jù)這個(gè)引用指向調(diào)用子類重寫(xiě)的這個(gè)方法(這個(gè)方法就是覆蓋override)。這個(gè)調(diào)用過(guò)程就稱為“動(dòng)態(tài)綁定”。

轉(zhuǎn)型需要注意的問(wèn)題:

向上轉(zhuǎn)型時(shí),父類指向子類引用對(duì)象會(huì)遺失除與父類對(duì)象共有的其他方法,也就是在轉(zhuǎn)型過(guò)程中,子類的新有的方法都會(huì)遺失掉,在編譯時(shí),系統(tǒng)會(huì)提供找不到方法的錯(cuò)誤。

實(shí)例如下:

public class Animal {

     public void eat(){

          System.out.println("animal eatting...");

     }

}

class Bird extends Animal{

     public void eat(){

          System.out.println("bird eatting...");

     }

     public void fly(){

          System.out.println("bird flying...");

     }

}

class Main{   

     public static void main(String[] args) {

          Animal b=new Bird(); //向上轉(zhuǎn)型

          b.eat();

     b.fly(); //此處提示在Animal中沒(méi)有定義fly方法。

}

在向下轉(zhuǎn)型過(guò)程中,分為兩種情況:

情況一:如果父類引用的對(duì)象如果引用的是指向的子類對(duì)象,那么在向下轉(zhuǎn)型的過(guò)程中是安全的。也就是編譯是不會(huì)出錯(cuò)誤的。

情況二:如果父類引用的對(duì)象是父類本身,那么在向下轉(zhuǎn)型的過(guò)程中是不安全的,編譯不會(huì)出錯(cuò),但是運(yùn)行時(shí)會(huì)出現(xiàn)java.lang.ClassCastException錯(cuò)誤。它可以使用instanceof來(lái)避免出錯(cuò)此類錯(cuò)誤。

實(shí)例如下:

public class Girl {

     public void smile(){

          System.out.println("girl smile()...");

     }

}

class MMGirl extends Girl{

          @Override

     public void smile() {

                   System.out.println("MMirl smile sounds sweet...");

     }

     public void c(){

          System.out.println("MMirl c()...");

     }

}

class main{

          public static void main(String[] args) {

          Girl g1=new MMGirl(); //向上轉(zhuǎn)型

          g1.smile();

          MMGirl mmg=(MMGirl)g1;  //向下轉(zhuǎn)型,編譯和運(yùn)行皆不會(huì)出錯(cuò)

          mmg.smile();

          mmg.c();

          Girl g2=new Girl();

      //MMGirl mmg1=(MMGirl)g2; //不安全的向下轉(zhuǎn)型,編譯無(wú)錯(cuò)但會(huì)運(yùn)行會(huì)出錯(cuò)

      //mmg1.smile();

      //mmg1.c();

          if(g2 instanceof MMGirl){

              MMGirl mmg1=(MMGirl)g2;

              mmg1.smile();

              mmg1.c();

          }

     }

總結(jié):

1、父類引用可以指向子類對(duì)象,子類引用不能指向父類對(duì)象。

2、把子類對(duì)象直接賦給父類引用叫upcasting向上轉(zhuǎn)型,向上轉(zhuǎn)型不用強(qiáng)制轉(zhuǎn)型。

   如Father father = new Son();

3、把指向子類對(duì)象的父類引用賦給子類引用叫向下轉(zhuǎn)型(downcasting),要強(qiáng)制轉(zhuǎn)型。

   如father就是一個(gè)指向子類對(duì)象的父類引用,把father賦給子類引用son 即Son son =(Son)father;

   其中father前面的(Son)必須添加,進(jìn)行強(qiáng)制轉(zhuǎn)換。

4、upcasting 會(huì)丟失子類特有的方法,但是子類overriding 父類的方法,子類方法有效

5、向上轉(zhuǎn)型的作用,減少重復(fù)代碼,父類為參數(shù),調(diào)有時(shí)用子類作為參數(shù),就是利用了向上轉(zhuǎn)型。這樣使代碼變得簡(jiǎn)潔。體現(xiàn)了JAVA的抽象編程思想。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • Spring Boot實(shí)戰(zhàn)之模板引擎

    Spring Boot實(shí)戰(zhàn)之模板引擎

    這篇文章主要介紹了Spring Boot實(shí)戰(zhàn)之模板引擎,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Maven修改運(yùn)行環(huán)境配置代碼實(shí)例

    Maven修改運(yùn)行環(huán)境配置代碼實(shí)例

    這篇文章主要介紹了Maven修改運(yùn)行環(huán)境配置代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • java多種幻燈片切換特效(經(jīng)典)

    java多種幻燈片切換特效(經(jīng)典)

    功能說(shuō)明: 代碼實(shí)現(xiàn)了多種幻燈片變換特效. 如:淡入淡出、緩慢覆蓋、旋轉(zhuǎn)覆蓋等10多種變換效果。
    2013-03-03
  • Java方法的參數(shù)傳遞機(jī)制詳解

    Java方法的參數(shù)傳遞機(jī)制詳解

    這篇文章主要介紹了Java方法的參數(shù)傳遞機(jī)制詳解,對(duì)于Java初學(xué)者來(lái)說(shuō),剛學(xué)習(xí)Java的時(shí)候可能經(jīng)常會(huì)聽(tīng)到調(diào)用方法時(shí)參數(shù)的值傳遞與引用傳遞,但是,實(shí)際上Java中方法的參數(shù)傳遞機(jī)制只有值傳遞,需要的朋友可以參考下
    2024-01-01
  • java實(shí)現(xiàn)多線程之定時(shí)器任務(wù)

    java實(shí)現(xiàn)多線程之定時(shí)器任務(wù)

    本篇文章主要介紹了java實(shí)現(xiàn)多線程之定時(shí)器任務(wù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • 為什么說(shuō)要慎用SpringBoot @ComponentScan

    為什么說(shuō)要慎用SpringBoot @ComponentScan

    本文主要介紹了為什么說(shuō)要慎用SpringBoot @ComponentScan,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Java Integer.ValueOf()的一些了解

    Java Integer.ValueOf()的一些了解

    這篇文章主要介紹了Java Integer.ValueOf()的一些了解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • feign遠(yuǎn)程調(diào)用無(wú)法傳遞對(duì)象屬性405的問(wèn)題

    feign遠(yuǎn)程調(diào)用無(wú)法傳遞對(duì)象屬性405的問(wèn)題

    這篇文章主要介紹了feign遠(yuǎn)程調(diào)用無(wú)法傳遞對(duì)象屬性405的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • mybatis實(shí)現(xiàn)遍歷Map的key和value

    mybatis實(shí)現(xiàn)遍歷Map的key和value

    這篇文章主要介紹了mybatis實(shí)現(xiàn)遍歷Map的key和value方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Spring?Boot?實(shí)現(xiàn)字段唯一校驗(yàn)功能(實(shí)例代碼)

    Spring?Boot?實(shí)現(xiàn)字段唯一校驗(yàn)功能(實(shí)例代碼)

    這篇文章主要介紹了Spring?Boot?實(shí)現(xiàn)字段唯一校驗(yàn),實(shí)現(xiàn)代碼很簡(jiǎn)單,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08

最新評(píng)論