學習要點
- 多態的優勢和應用場合
- 父類和子類之間的類型轉換
- instanceof運算符的使用
- 父類作為方法形參實現多態
- 父類作為返回值實現多態
使用多態的原因
需求描述:
在寵物管理系統中,寵物餓了,需要主人給他喂食,不同的寵物吃不一樣的東西,並且健康值恢復情況也不一樣。
狗狗:吃狗糧,吃完后健康值增加3。
企鵝:吃魚,吃完后健康值增加5。
問題分析:
狗狗類:增加狗狗吃食的方法
企鵝類:增加企鵝吃食的方法
創建主人類:編寫給狗狗喂食的方法,編寫給企鵝喂食的方法
編寫測試方法:調用主人類給狗狗喂的方法,調用主人類給企鵝喂的方法
編碼實現
public class Master { public void feed( Dog dog ) { dog.eat(); } public void feed( Penguin pgn ) { pgn.eat(); } public void feed( XXX xxx ) { //如果增加其他寵物……. xxx.eat(); } }
編碼實現存在的問題
- 隨着寵物的增多,代碼需要不斷修改,代碼可擴展性太差。
- 主人喂食方法的參數都是Pet子類,是否可以采用feed(Pet pet)實現?
- 使用多態實現!
多態
生活中的多態
都是打印機,但是不同類型的打印機,打印出的效果是不同的。
同一事物,由於條件不同,產生的結果也是不同的。
程序中的多態
多態:同一個引用類型,使用不同的實例而執行不同操作。程序中使用父類定義引用,使用子類對象運行。
feed(Pet pet); //pet實際指向dog、penguin、cat等對象
如何使用多態
- 編寫父類
- 編寫子類,子類重寫父類方法
- 運行時,使用父類的類型,子類的對象(黃色部分為實現多態兩個要素)
向上轉型:Pet pet = new Dog();// 自動類型轉換
實現多態的兩種形式
使用父類作為方法形參實現多態
使用父類作為方法返回值實現多態
上機練習
使用多態實現寵物管理系統的喂食。
增加貓,貓吃貓糧,健康值增加5。
使用父類作為方法返回值實現多態//工廠模式
使用多態實現寵物領養
使用父類作為方法返回值
實現思路
在Master類添加領養方法getPet(String typeId )
創建測試類,根據主人選擇寵物類型編號來領養寵物。
父類到子類的轉換
問題描述
實現主人與寵物玩耍功能
和狗狗玩接飛盤游戲,狗狗的健康值減少10,與主人親密度增加5。
和企鵝玩游泳游戲,企鵝的健康值減少10,與主人親密度增加5。
問題分析
給Dog添加接飛盤方法catchingFlyDisc( )
給Penguin添加游泳方法swimming( )
給主人添加play(Pet pet)方法
代碼實現以及問題
向下轉型(強制類型轉換)
為了避免類型轉換報錯,使用instanceof運算符進行類型判斷,判斷的結果為布爾值類型。
語法結構:
對象 instanceof 類或接口
使用場合:instanceof通常和強制類型轉換結合使用。
上機練習
優化寵物管理系統,使用多態實現主人領養寵物並與寵物玩耍。
- 主人根據寵物編號領養寵物。
- 主人和狗狗玩接飛盤游戲,狗狗健康值減少10,與主人親密度增加5。
- 主人和企鵝玩游泳游戲,企鵝健康值減少10,與主人親密度增加5。
總結
多態可以減少類中代碼量,可以提高代碼的可擴展性和可維護性
- 向上轉型——子類轉換為父類,自動進行類型轉換
- 向下轉型——父類轉換為子類,結合instanceof運算符進行強制類型轉換
實現多態的兩種方式
- 使用父類作為方法形參實現多態
- 使用父類作為方法返回值實現多態