日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第三次学JAVA再学不好就吃翔(part35)--多态向上转型和向下转型

發布時間:2023/12/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第三次学JAVA再学不好就吃翔(part35)--多态向上转型和向下转型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

學習筆記,僅供參考


文章目錄

    • 面向對象
      • 多態
        • 多態向上轉型和向下轉型
        • 多態的好處和弊端


面向對象


多態


多態向上轉型和向下轉型


我們首先通過以下代碼復習一下自動類型提升強制類型轉換

class BunnyAnimal0602 {public static void main(String[] args) {int i = 10;byte b = 20;i = b; //自動類型提升b = (byte)i; //強制類型轉換} }

由此,我們引出多態中的向上轉型和向下轉型:

class BunnyAnimal0602 {public static void main(String[] args) {Father f = new Son();f.method();} }class Father {int num = 10;public void print() {System.out.println("Print Father");}}class Son extends Father {int num = 20;public void print() {System.out.println("Print Son");}public static void method() {System.out.println("Method Son");} }

報錯信息:

---------- javac ---------- BunnyAnimal0602.java:4: 錯誤: 找不到符號f.method();^符號: 方法 method()位置: 類型為Father的變量 f 1 個錯誤Output completed (2 sec consumed) - Normal Termination

父類引用指向子類對象就是向上轉型。同時,我們看到在上述代碼中,由于父類中沒有method方法,所以編譯時報錯。

下面我們通過向下轉型,去調用子類中的method方法:

class BunnyAnimal0602 {public static void main(String[] args) {Father f = new Son();System.out.println(f.num);Son s = (Son)f;s.method();} }class Father {int num = 10;public void print() {System.out.println("Print Father");}}class Son extends Father {int num = 20;public void print() {System.out.println("Print Son");}public static void method() {System.out.println("Method Son");} }

輸出:

10 Method Son

內存圖:


多態的好處和弊端


  • 多態的好處
    • 提高代碼的維護性
    • 提高代碼的擴展性
  • 多態的弊端
    • 不能使用子類特有的屬性和行為

  • 舉個例子(多態的好處)
class AnimalBunnyCat {public static void main(String[] args) {method(new Bunny());method(new Cat());}public static void method(Animal a) {a.eat();} }class Animal {public void eat() {System.out.println("動物吃飯");} }class Bunny extends Animal {public void eat() {System.out.println("兔子吃胡蘿卜");} }class Cat extends Animal {public void eat() {System.out.println("貓吃魚");} }

輸出:

兔子吃胡蘿卜 貓吃魚
  • 舉個例子(強轉)

基于上面的代碼,我們給method增加一些功能,如果輸入參數是Cat的對象,則增加Cat特有的功能,如果輸入參數是Bunny的對象,則增加Bunny特有的功能:

class AnimalBunnyCat {public static void main(String[] args) {method(new Bunny());method(new Cat());}public static void method(Animal a) {if (a instanceof Bunny) {Bunny b = (Bunny)a;b.eat();b.play();} else if (a instanceof Cat) {Cat c = (Cat)a;c.eat();c.sleep();} else {a.eat();}} }class Animal {public void eat() {System.out.println("動物吃飯");} }class Bunny extends Animal {public void eat() {System.out.println("兔子吃胡蘿卜");}public void play() {System.out.println("兔子玩耳朵");} }class Cat extends Animal {public void eat() {System.out.println("貓吃魚");}public void sleep() {System.out.println("貓睡覺");} }

輸出:

兔子吃胡蘿卜 兔子玩耳朵 貓吃魚 貓睡覺

關鍵字instanceof為判斷前面的引用是否是后面的數據類型。如果沒有經過instanceof判斷,我們可能會把Cat強制轉換為Bunny這樣就會出現類型轉換異常ClassCastException


總結

以上是生活随笔為你收集整理的第三次学JAVA再学不好就吃翔(part35)--多态向上转型和向下转型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。