1-11 Java 多态、类型转型
文章目錄
- 1、業(yè)務(wù)場景
- 2、多態(tài)調(diào)用
- 3、多態(tài)應(yīng)用
- 1)業(yè)務(wù)場景
- 2)傳統(tǒng)代碼實(shí)現(xiàn)
- 3)問題思考
- 4)多態(tài)代碼實(shí)現(xiàn)
- 4、向上、向下轉(zhuǎn)型
- 1)舉例
- 2)小總結(jié)
面向?qū)ο筇卣?#xff1a;抽象、封裝、繼承和多態(tài),這些是 Java 作為一個面向?qū)ο缶幊痰暮诵摹?
上篇文章中說道抽象類不能通過普通方式 new 自己,那么可以 new 子類,這就是這節(jié)的內(nèi)容。
這節(jié)內(nèi)容寫的類可能多那么一點(diǎn),但是重點(diǎn)關(guān)注類與類之間的關(guān)系,以及如何創(chuàng)建并使用類的。
1、業(yè)務(wù)場景
先粘代碼上來,一個抽象類,兩個子類,有共有方法 hobby()
package oc10; /*** @author 太上碼農(nóng)/taishangcode* @desc 這是一個抽象類*/ public abstract class Student {public abstract void hobby(); } package oc10; public class Xiaoming extends Student {public void hobby() {System.out.println("愛好是玩王者榮耀");} } package oc10; public class Xiaogang extends Student {public void hobby() {System.out.println("愛好是玩LOL");} }2、多態(tài)調(diào)用
創(chuàng)建測試類
package oc10; /*** @author 太上碼農(nóng)/taishangcode* @desc 多態(tài)調(diào)用*/ public class StudentTest {public static void main(String[] args) {//多態(tài)代碼特點(diǎn):左邊是父類, 等號右邊是具體的實(shí)現(xiàn)子類Student xiaoming = new Xiaoming();xiaoming.hobby();Student xiaogang = new Xiaogang();xiaogang.hobby();//這種方式調(diào)用的是父類中必有的方法,子類進(jìn)行了重寫//如果是子類新增的方法(父類沒有),這種方式創(chuàng)建的對象是不能調(diào)用子類新增方法的//自己可以在任意子類新增一個方法,看看能不能快捷鍵提示該方法} }運(yùn)行結(jié)果:
愛好是玩王者榮耀 愛好是玩LOL3、多態(tài)應(yīng)用
上面那個例子既然不能調(diào)用子類新增的東西,為啥不干脆直接子類 new 自己呢,而且自己的方法都能使用?其實(shí),也是結(jié)合實(shí)際場景來選擇使用哪種方式。看下面例子
1)業(yè)務(wù)場景
商家 A 是專門賣各種包裝肉類的,與生產(chǎn)廠家有合作伙伴關(guān)系,這個生產(chǎn)廠家負(fù)責(zé)生產(chǎn)各種肉類。我們寫的目的,就是最后完成商家賣各種肉類商品
分析:商家 A 賣肉產(chǎn)品是個方法,生產(chǎn)廠家既然生產(chǎn)各種肉類,那么我們可以提供一個抽象類,并編寫生產(chǎn)肉的抽象方法,單獨(dú)生產(chǎn)各種肉的生產(chǎn)線類去繼承抽象類,比如豬肉生產(chǎn)線,雞肉生產(chǎn)線。
2)傳統(tǒng)代碼實(shí)現(xiàn)
因?yàn)樯碳乙蕾嚿a(chǎn)廠家,這里先寫好生產(chǎn)的相關(guān)類
① 廠家抽象類:
② 提供一個豬肉生產(chǎn)線:
package oc11; /*** @author 太上碼農(nóng)/taishangcode* @desc 豬肉生產(chǎn)線*/ public class PigMeatFactory extends MeatFactory {@Overridepublic void meat() {System.out.println("豬肉");} }③ 提供一個雞肉生產(chǎn)線:
package oc11; /*** @author 太上碼農(nóng)/taishangcode* @desc 雞肉生產(chǎn)線*/ public class ChickenMeatFactory extends MeatFactory {@Overridepublic void meat() {System.out.println("雞肉");} }④ 商家類
這才是核心,你賣豬肉,賣雞肉,按傳統(tǒng)方式來,是不是要各自寫各自的方法:
⑤ 測試類
package oc11; /*** @author 太上碼農(nóng)/taishangcode* @desc 模擬終端銷售*/ public class ShopTest {public static void main(String[] args) {//創(chuàng)建一個商店Shopee shopee = new Shopee();//賣豬肉,方法里聲明了參數(shù),所以我們需要創(chuàng)建一個 PigMeatFactory 對象并穿進(jìn)去//sellPig(PigMeatFactory pig)PigMeatFactory pigMeatFactory = new PigMeatFactory();shopee.sellPig(pigMeatFactory);//同樣賣雞肉://方法聲明的是sellChicken(ChickenMeatFactory chicken)ChickenMeatFactory chickenMeatFactory = new ChickenMeatFactory();shopee.sellChicken(chickenMeatFactory);} }運(yùn)行結(jié)果:
豬肉 雞肉3)問題思考
如果商店后面陸續(xù)要售賣各種肉類, 是不是要繼續(xù)編寫售賣對應(yīng)品種肉的方法?
我們既然學(xué)了多態(tài),那就可以進(jìn)行優(yōu)化:
4)多態(tài)代碼實(shí)現(xiàn)
廠家抽象類、豬肉生產(chǎn)線類、雞肉生產(chǎn)線類都不變,只修改商家類和測試類
① 修改商家類:
② 修改測試類
修改測試類是因?yàn)閮?yōu)化后,方法名變了,其他的還是不變:
運(yùn)行結(jié)果同上,不變。
4、向上、向下轉(zhuǎn)型
父類 對象名 = new 子類();結(jié)合賦值的概念 int a = 1 看上面代碼,是子類的實(shí)例給了父類引用,從兒子到父親(低 -> 高),這叫向上轉(zhuǎn)型。
還記得上面代碼的局限嗎?父類引用對象只能調(diào)用子類重寫的父類中存在的抽象方法,不能調(diào)用子類新增、父類沒有的方法,那能不能調(diào)用,可以,再向下轉(zhuǎn)回來。記住“再”這個字。
1)舉例
定義一個動物抽象類,里面有動物叫聲的方法,然后定義一個子類貓類實(shí)現(xiàn)抽象類,并新增一個捉老鼠的方法:
① 抽象類動物類
② 子類:貓類
package oc11; public class Cat extends Animal {@Overridepublic void say() {System.out.println("喵喵~~");}public void grasp() {//子類新增方法System.out.println("捉老鼠");} }③ 測試類
package oc11; public class AnimalTest {public static void main(String[] args) {Animal cat = new Cat();//向上轉(zhuǎn)型cat.say();//向下轉(zhuǎn)型用法:子類 對象名 = (子類)父類引用;//還記得剛才的"再"嗎,也就是向下轉(zhuǎn)型前一定發(fā)生過向上轉(zhuǎn)型Cat c = (Cat)cat;//向下轉(zhuǎn)型c.grasp(); //調(diào)用子類新增的方法} }運(yùn)行結(jié)果:
喵喵~~ 捉老鼠2)小總結(jié)
記住,發(fā)生過向上轉(zhuǎn)型的對象(子類給父類),不能調(diào)用子類新增方法,想調(diào)用,還得再轉(zhuǎn)回來(向下轉(zhuǎn)型,父類轉(zhuǎn)子類)
所以,什么情況下使用多態(tài),還得看實(shí)際情況,比如第三個標(biāo)題中的例子就很適合多態(tài),你像上面這個動物的例子,想調(diào)用捉老鼠的方法,干脆直接 Cat 類 new 自己吧。
學(xué)習(xí) Java 的小伙伴,也可搜索并關(guān)注公眾號 taishangcode 進(jìn)行同步學(xué)習(xí)。
總結(jié)
以上是生活随笔為你收集整理的1-11 Java 多态、类型转型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统_05_调度算法(个人总结)
- 下一篇: Hbase之一月速成:Hbase的Jav