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