学习要点

  • 多态的优势和应用场合
  • 父类和子类之间的类型转换
  • 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运算符进行强制类型转换

实现多态的两种方式

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

JavaSE-10 多态的更多相关文章

  1. Javase中多态polymorphic的简单介绍

    -------------多态-----------------  (1)面向对象三大核心思想:    1.封装 2.继承 3.多态 (2)多态定义:父类的引用指向子类的对象.   (3)引用指的是父 ...

  2. javase(10)_多线程基础

    一.排队等待 1.下面的这个简单的 Java 程序完成四项不相关的任务.这样的程序有单个控制线程,控制在这四个任务之间线性地移动.此外,因为所需的资源 ― 打印机.磁盘.数据库和显示屏 -- 由于硬件 ...

  3. javaSE第九天

      第九天    50 1. final关键字(掌握)    50 (1)定义:    50 (2)特点:    51 (3)面试相关:    51 A:final修饰的局部变量    51 B:fi ...

  4. JavaSE_ 面向对象 总目录(7~10)

    JavaSE学习总结第07天_面向对象2 07.01 成员变量和局部变量的区别07.02 方法的形式参数是类名的调用07.03 匿名对象的概述和应用07.04 封装的概述07.05 封装的好处和设计原 ...

  5. JavaSE学习总结第09天_面向对象4

      09.01 final关键字引入 例: class Fu { public final void show() { System.out.println("访问底层资源"); ...

  6. java四大特性理解(封装继承多态抽象)

    封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一 ...

  7. c#之字符串,列表,接口,队列,栈,多态

    1.字符串的用法 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  8. JavaSE日常笔记汇总

    1. If和switch的比较 2. continue的注意事项 在for循环中,当执行continue语句时,i++还是会执行,continue语句只代表此次循环结束,i还是会累加,并继续执行下次循 ...

  9. JDK 9 & JDK 10 新特性

    JDK 9 新增了不少特性,官方文档:https://docs.oracle.com/javase/9/whatsnew/toc.htm#JSNEW-GUID-527735CF-44E1-4144-9 ...

  10. Java中的继承、封装、多态的理解

    Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extend ...

随机推荐

  1. 二:网络--GET请求和POST请求

    一.GET请求和POST请求简单说明 GET - 从指定的服务器中获取数据 POST - 提交数据给指定的服务器处理 GET方法: 使用GET方法时,查询字符串(键值对)被附加在URL地址后面一起发送 ...

  2. 【Usaco2008 Dec】Patting Heads

    [题目链接] 点击打开链接 [算法] 我们知道,每个编号为a[i]都要被编号是a[i]的约数的牛拍一次头(除了它自己),因此,只需用类似于筛法的方式统计答案, 即可 [代码] #include< ...

  3. bzoj 3872 [ Poi 2014 ] Ant colony —— 二分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3872 从食蚁兽所在的边向叶节点推,会得到一个渐渐放大的取值区间,在叶子节点上二分有几群蚂蚁符 ...

  4. bootstrap-table 行合并和列合并,以及固定列宽度等问题

    列合并和列宽度固定: .setWidth { table-layout: fixed; } .setWidth > thead > tr > th { width: 80px; } ...

  5. context:property-placeholder作用

    原文地址:http://blog.sina.com.cn/s/blog_a0de59cf0101dqeb.html spring去加载,这个元素的写法如下: <context:property- ...

  6. E201700525-hm

    skeleton n. 骨骼; (建筑物等的) 骨架; 梗概; 骨瘦如柴的人(或动物);adj. 骨骼的; 骨瘦如柴的; 概略的; 基本的; cloud   n. 云; 云状物;  invoke   ...

  7. bzoj 2257: [Jsoi2009]瓶子和燃料【裴蜀定理+gcd】

    裴蜀定理:若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立. 所以最后能得到的最小燃料书就是gcd,所以直 ...

  8. bzoj 4069: [Apio2015]巴厘岛的雕塑【dp】

    居然要对不同的数据写不同的dp= = 首先记得开long long,<<的时候要写成1ll<<bt 根据or的性质,总体思路是从大到小枚举答案的每一位,看是否能为0. 首先对于 ...

  9. 【技巧】解决win10的1803版本下,无法收到1809推送、从而无法更新到1903版本的问题。

    figure:first-child { margin-top: -20px; } #write ol, #write ul { position: relative; } img { max-wid ...

  10. Java标准输入流system.in报错: java.util.NoSuchElementException解决方法

    我的程序大概是这样的: main()主函数里面,调用两个自定义的方法,这里我们称之为方法a和方法b: 主函数main()里有一个:Scanner scanner = new Scanner(Syste ...