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运算符进行强制类型转换

实现多态的两种方式

  • 使用父类作为方法形参实现多态
  • 使用父类作为方法返回值实现多态

 

posted @ 2018-01-09 21:06  rask  阅读(1650)  评论(0编辑  收藏  举报