JavaSE-10 多態


學習要點

  • 多態的優勢和應用場合
  • 父類和子類之間的類型轉換
  • 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();

       }

}       

  

 編碼實現存在的問題

  1. 隨着寵物的增多,代碼需要不斷修改,代碼可擴展性太差。
  2. 主人喂食方法的參數都是Pet子類,是否可以采用feed(Pet pet)實現?
  3. 使用多態實現!

 

 

多態

生活中的多態

 

都是打印機,但是不同類型的打印機,打印出的效果是不同的。

同一事物,由於條件不同,產生的結果也是不同的。

 

程序中的多態

多態:同一個引用類型,使用不同的實例而執行不同操作。程序中使用父類定義引用,使用子類對象運行。

feed(Pet pet);  //pet實際指向dog、penguin、cat等對象

  

 

如何使用多態

  1. 編寫父類
  2. 編寫子類,子類重寫父類方法
  3. 運行時,使用父類的類型,子類的對象(黃色部分為實現多態兩個要素)
向上轉型:Pet pet = new Dog();// 自動類型轉換

  

實現多態的兩種形式

使用父類作為方法形參實現多態

使用父類作為方法返回值實現多態

 

上機練習

使用多態實現寵物管理系統的喂食。

 

增加貓,貓吃貓糧,健康值增加5。

 

 

使用父類作為方法返回值實現多態//工廠模式

使用多態實現寵物領養

使用父類作為方法返回值

實現思路

在Master類添加領養方法getPet(String typeId )

創建測試類,根據主人選擇寵物類型編號來領養寵物。

 

 

  

父類到子類的轉換

問題描述

實現主人與寵物玩耍功能

和狗狗玩接飛盤游戲,狗狗的健康值減少10,與主人親密度增加5。

和企鵝玩游泳游戲,企鵝的健康值減少10,與主人親密度增加5。

問題分析

給Dog添加接飛盤方法catchingFlyDisc( )

給Penguin添加游泳方法swimming( )

給主人添加play(Pet pet)方法

代碼實現以及問題

 

向下轉型(強制類型轉換)

 

為了避免類型轉換報錯,使用instanceof運算符進行類型判斷,判斷的結果為布爾值類型。

語法結構:

對象  instanceof  類或接口

使用場合:instanceof通常和強制類型轉換結合使用。

 

 

上機練習

優化寵物管理系統,使用多態實現主人領養寵物並與寵物玩耍。

  1. 主人根據寵物編號領養寵物。
  2. 主人和狗狗玩接飛盤游戲,狗狗健康值減少10,與主人親密度增加5。
  3. 主人和企鵝玩游泳游戲,企鵝健康值減少10,與主人親密度增加5。

 

 

總結

多態可以減少類中代碼量,可以提高代碼的可擴展性和可維護性

  • 向上轉型——子類轉換為父類,自動進行類型轉換
  • 向下轉型——父類轉換為子類,結合instanceof運算符進行強制類型轉換

實現多態的兩種方式

  • 使用父類作為方法形參實現多態
  • 使用父類作為方法返回值實現多態

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM