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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

1-11 Java 多态、类型转型

發(fā)布時間:2023/12/20 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1-11 Java 多态、类型转型 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 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é)果:

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

3、多態(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)類
① 廠家抽象類:

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

② 提供一個豬肉生產(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 Shopee {public void sellPig(PigMeatFactory pig) {pig.meat();}public void sellChicken(ChickenMeatFactory chicken) {chicken.meat();} }

⑤ 測試類

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)線類都不變,只修改商家類和測試類
① 修改商家類:

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

② 修改測試類
修改測試類是因?yàn)閮?yōu)化后,方法名變了,其他的還是不變:

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

運(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 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();//向上轉(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。