第三次学JAVA再学不好就吃翔(part35)--多态向上转型和向下转型
學(xué)習(xí)筆記,僅供參考
文章目錄
- 面向?qū)ο?/li>
- 多態(tài)
- 多態(tài)向上轉(zhuǎn)型和向下轉(zhuǎn)型
- 多態(tài)的好處和弊端
面向?qū)ο?/h2>
多態(tài)
多態(tài)向上轉(zhuǎn)型和向下轉(zhuǎn)型
我們首先通過(guò)以下代碼復(fù)習(xí)一下自動(dòng)類型提升和強(qiáng)制類型轉(zhuǎn)換:
class BunnyAnimal0602 {public static void main(String[] args) {int i = 10;byte b = 20;i = b; //自動(dòng)類型提升b = (byte)i; //強(qiáng)制類型轉(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");} }報(bào)錯(cuò)信息:
---------- javac ---------- BunnyAnimal0602.java:4: 錯(cuò)誤: 找不到符號(hào)f.method();^符號(hào): 方法 method()位置: 類型為Father的變量 f 1 個(gè)錯(cuò)誤Output completed (2 sec consumed) - Normal Termination父類引用指向子類對(duì)象就是向上轉(zhuǎn)型。同時(shí),我們看到在上述代碼中,由于父類中沒(méi)有method方法,所以編譯時(shí)報(bào)錯(cuò)。
下面我們通過(guò)向下轉(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)的好處
- 提高代碼的維護(hù)性
- 提高代碼的擴(kuò)展性
- 多態(tài)的弊端
- 不能使用子類特有的屬性和行為
- 舉個(gè)例子(多態(tài)的好處)
輸出:
兔子吃胡蘿卜 貓吃魚- 舉個(gè)例子(強(qiáng)轉(zhuǎn))
基于上面的代碼,我們給method增加一些功能,如果輸入?yún)?shù)是Cat的對(duì)象,則增加Cat特有的功能,如果輸入?yún)?shù)是Bunny的對(duì)象,則增加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("動(dòng)物吃飯");} }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("貓睡覺(jué)");} }輸出:
兔子吃胡蘿卜 兔子玩耳朵 貓吃魚 貓睡覺(jué)關(guān)鍵字instanceof為判斷前面的引用是否是后面的數(shù)據(jù)類型。如果沒(méi)有經(jīng)過(guò)instanceof判斷,我們可能會(huì)把Cat強(qiáng)制轉(zhuǎn)換為Bunny這樣就會(huì)出現(xiàn)類型轉(zhuǎn)換異常ClassCastException
總結(jié)
以上是生活随笔為你收集整理的第三次学JAVA再学不好就吃翔(part35)--多态向上转型和向下转型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 倡导节约的英语作文
- 下一篇: 努比亚首款折叠屏手机曝光 型号为Z60