第三次学JAVA再学不好就吃翔(part35)--多态向上转型和向下转型
生活随笔
收集整理的這篇文章主要介紹了
第三次学JAVA再学不好就吃翔(part35)--多态向上转型和向下转型
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
學習筆記,僅供參考
文章目錄
- 面向?qū)ο?/li>
- 多態(tài)
- 多態(tài)向上轉(zhuǎn)型和向下轉(zhuǎn)型
- 多態(tài)的好處和弊端
面向?qū)ο?/h2>
多態(tài)
多態(tài)向上轉(zhuǎn)型和向下轉(zhuǎn)型
我們首先通過以下代碼復習一下自動類型提升和強制類型轉(zhuǎn)換:
class BunnyAnimal0602 {public static void main(String[] args) {int i = 10;byte b = 20;i = b; //自動類型提升b = (byte)i; //強制類型轉(zhuǎn)換} }由此,我們引出多態(tài)中的向上轉(zhuǎn)型和向下轉(zhuǎn)型:
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父類引用指向子類對象就是向上轉(zhuǎn)型。同時,我們看到在上述代碼中,由于父類中沒有method方法,所以編譯時報錯。
下面我們通過向下轉(zhuǎn)型,去調(diào)用子類中的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內(nèi)存圖:
多態(tài)的好處和弊端
- 多態(tài)的好處
- 提高代碼的維護性
- 提高代碼的擴展性
- 多態(tài)的弊端
- 不能使用子類特有的屬性和行為
- 舉個例子(多態(tài)的好處)
輸出:
兔子吃胡蘿卜 貓吃魚- 舉個例子(強轉(zhuǎn))
基于上面的代碼,我們給method增加一些功能,如果輸入?yún)?shù)是Cat的對象,則增加Cat特有的功能,如果輸入?yún)?shù)是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("貓睡覺");} }輸出:
兔子吃胡蘿卜 兔子玩耳朵 貓吃魚 貓睡覺關(guān)鍵字instanceof為判斷前面的引用是否是后面的數(shù)據(jù)類型。如果沒有經(jīng)過instanceof判斷,我們可能會把Cat強制轉(zhuǎn)換為Bunny這樣就會出現(xiàn)類型轉(zhuǎn)換異常ClassCastException
總結(jié)
以上是生活随笔為你收集整理的第三次学JAVA再学不好就吃翔(part35)--多态向上转型和向下转型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 倡导节约的英语作文
- 下一篇: 第三次学JAVA再学不好就吃翔(part