中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中向上轉型與向下轉型的區別有什么

發布時間:2020-12-04 16:30:48 來源:億速云 閱讀:230 作者:Leah 欄目:移動開發

Java中向上轉型與向下轉型的區別有什么?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

 Java 向上轉型和向下轉型的詳解

轉型是在繼承的基礎上而言的,繼承是面向對象語言中,代碼復用的一種機制,通過繼承,子類可以復用父類的功能,如果父類不能滿足當前子類的需求,則子類可以重寫父類中的方法來加以擴展。

向上轉型:子類引用的對象轉換為父類類型稱為向上轉型。通俗地說就是是將子類對象轉為父類對象。此處父類對象可以是接口

向下轉型:父類引用的對象轉換為子類類型稱為向下轉型。

前者是一個向上轉型,Animal dog 引用指向new Dog();子類對象當成父類對象,只能調用父類的成員,如果子類重寫了父類的方法就根據這個引用指向調用子類重寫的這個方法(這個方法就是覆蓋override)。這個調用過程就稱為“動態綁定”。

轉型需要注意的問題:

向上轉型時,父類指向子類引用對象會遺失除與父類對象共有的其他方法,也就是在轉型過程中,子類的新有的方法都會遺失掉,在編譯時,系統會提供找不到方法的錯誤。

實例如下:

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(); //向上轉型

          b.eat();

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

}

在向下轉型過程中,分為兩種情況:

情況一:如果父類引用的對象如果引用的是指向的子類對象,那么在向下轉型的過程中是安全的。也就是編譯是不會出錯誤的。

情況二:如果父類引用的對象是父類本身,那么在向下轉型的過程中是不安全的,編譯不會出錯,但是運行時會出現java.lang.ClassCastException錯誤。它可以使用instanceof來避免出錯此類錯誤。

實例如下:

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(); //向上轉型

          g1.smile();

          MMGirl mmg=(MMGirl)g1;  //向下轉型,編譯和運行皆不會出錯

          mmg.smile();

          mmg.c();

          Girl g2=new Girl();

      //MMGirl mmg1=(MMGirl)g2; //不安全的向下轉型,編譯無錯但會運行會出錯

      //mmg1.smile();

      //mmg1.c();

          if(g2 instanceof MMGirl){

              MMGirl mmg1=(MMGirl)g2;

              mmg1.smile();

              mmg1.c();

          }

     }

總結:

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

2、把子類對象直接賦給父類引用叫upcasting向上轉型,向上轉型不用強制轉型。

   如Father father = new Son();

3、把指向子類對象的父類引用賦給子類引用叫向下轉型(downcasting),要強制轉型。

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

   其中father前面的(Son)必須添加,進行強制轉換。

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

5、向上轉型的作用,減少重復代碼,父類為參數,調有時用子類作為參數,就是利用了向上轉型。這樣使代碼變得簡潔。體現了JAVA的抽象編程思想。

看完上述內容,你們掌握Java中向上轉型與向下轉型的區別有什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

花莲市| 永德县| 东港市| 仙桃市| 铁岭市| 广宁县| 宣汉县| 新绛县| 滦平县| 龙游县| 徐汇区| 通城县| 金华市| 竹山县| 抚远县| 昌黎县| 贵南县| 石门县| 日照市| 资讯| 邯郸市| 道孚县| 益阳市| 徐汇区| 大理市| 晋江市| 富顺县| 金坛市| 广东省| 岳普湖县| 五莲县| 遂宁市| 拜城县| 松桃| 隆尧县| 唐海县| 宜兴市| 克山县| 拜泉县| 融水| 黎平县|