第三次学JAVA再学不好就吃翔(part35)--多态向上转型和向下转型
生活随笔
收集整理的這篇文章主要介紹了
第三次学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內存圖:
多態的好處和弊端
- 多態的好處
- 提高代碼的維護性
- 提高代碼的擴展性
- 多態的弊端
- 不能使用子類特有的屬性和行為
- 舉個例子(多態的好處)
輸出:
兔子吃胡蘿卜 貓吃魚- 舉個例子(強轉)
基于上面的代碼,我們給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)--多态向上转型和向下转型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 倡导节约的英语作文
- 下一篇: 第三次学JAVA再学不好就吃翔(part