日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

1-11 Java 多态、类型转型

發布時間:2023/12/20 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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();//這種方式調用的是父類中必有的方法,子類進行了重寫//如果是子類新增的方法(父類沒有),這種方式創建的對象是不能調用子類新增方法的//自己可以在任意子類新增一個方法,看看能不能快捷鍵提示該方法} }

運行結果:

愛好是玩王者榮耀 愛好是玩LOL

3、多態應用

上面那個例子既然不能調用子類新增的東西,為啥不干脆直接子類 new 自己呢,而且自己的方法都能使用?其實,也是結合實際場景來選擇使用哪種方式??聪旅胬?/p>

1)業務場景

商家 A 是專門賣各種包裝肉類的,與生產廠家有合作伙伴關系,這個生產廠家負責生產各種肉類。我們寫的目的,就是最后完成商家賣各種肉類商品
分析:商家 A 賣肉產品是個方法,生產廠家既然生產各種肉類,那么我們可以提供一個抽象類,并編寫生產肉的抽象方法,單獨生產各種肉的生產線類去繼承抽象類,比如豬肉生產線,雞肉生產線。

2)傳統代碼實現

因為商家依賴生產廠家,這里先寫好生產的相關類
① 廠家抽象類:

package oc11; /*** @author 太上碼農/taishangcode* @desc 大型加工肉類的工廠*/ public abstract class MeatFactory {//加工肉類的方法public abstract void meat(); }

② 提供一個豬肉生產線:

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 Shopee {public void sellPig(PigMeatFactory pig) {pig.meat();}public void sellChicken(ChickenMeatFactory chicken) {chicken.meat();} }

⑤ 測試類

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)多態代碼實現

廠家抽象類、豬肉生產線類、雞肉生產線類都不變,只修改商家類和測試類
① 修改商家類:

package oc11; /*** @author 太上碼農/taishangcode* @desc 商家*/ public class Shopee {public void sellMeat(MeatFactory meatFactory) {meatFactory.meat();} }

② 修改測試類
修改測試類是因為優化后,方法名變了,其他的還是不變:

package oc11; public class ShopTest {public static void main(String[] args) {Shopee shopee = new Shopee();//Shopee只有方法 sellMeat(MeatFactory meatFactory)//為什么能傳遞子類呢,其是這樣對比你就知道為什么能傳進去了://MeatFactory meatFactory = new PigMeatFactory();//這就是多態的使用PigMeatFactory pigMeatFactory = new PigMeatFactory();shopee.sellMeat(pigMeatFactory);ChickenMeatFactory chickenMeatFactory = new ChickenMeatFactory();shopee.sellMeat(chickenMeatFactory);} }

運行結果同上,不變。

4、向上、向下轉型

父類 對象名 = new 子類();

結合賦值的概念 int a = 1 看上面代碼,是子類的實例給了父類引用,從兒子到父親(低 -> 高),這叫向上轉型

還記得上面代碼的局限嗎?父類引用對象只能調用子類重寫的父類中存在的抽象方法,不能調用子類新增、父類沒有的方法,那能不能調用,可以,向下轉回來。記住“再”這個字。

1)舉例

定義一個動物抽象類,里面有動物叫聲的方法,然后定義一個子類貓類實現抽象類,并新增一個捉老鼠的方法:
① 抽象類動物類

package oc11; public abstract class Animal {public abstract void say(); }

② 子類:貓類

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 多态、类型转型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。