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();
}
}
编码实现存在的问题
- 随着宠物的增多,代码需要不断修改,代码可扩展性太差。
- 主人喂食方法的参数都是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运算符进行强制类型转换
实现多态的两种方式
- 使用父类作为方法形参实现多态
- 使用父类作为方法返回值实现多态
JavaSE-10 多态的更多相关文章
- Javase中多态polymorphic的简单介绍
-------------多态----------------- (1)面向对象三大核心思想: 1.封装 2.继承 3.多态 (2)多态定义:父类的引用指向子类的对象. (3)引用指的是父 ...
- javase(10)_多线程基础
一.排队等待 1.下面的这个简单的 Java 程序完成四项不相关的任务.这样的程序有单个控制线程,控制在这四个任务之间线性地移动.此外,因为所需的资源 ― 打印机.磁盘.数据库和显示屏 -- 由于硬件 ...
- javaSE第九天
第九天 50 1. final关键字(掌握) 50 (1)定义: 50 (2)特点: 51 (3)面试相关: 51 A:final修饰的局部变量 51 B:fi ...
- JavaSE_ 面向对象 总目录(7~10)
JavaSE学习总结第07天_面向对象2 07.01 成员变量和局部变量的区别07.02 方法的形式参数是类名的调用07.03 匿名对象的概述和应用07.04 封装的概述07.05 封装的好处和设计原 ...
- JavaSE学习总结第09天_面向对象4
09.01 final关键字引入 例: class Fu { public final void show() { System.out.println("访问底层资源"); ...
- java四大特性理解(封装继承多态抽象)
封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一 ...
- c#之字符串,列表,接口,队列,栈,多态
1.字符串的用法 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...
- JavaSE日常笔记汇总
1. If和switch的比较 2. continue的注意事项 在for循环中,当执行continue语句时,i++还是会执行,continue语句只代表此次循环结束,i还是会累加,并继续执行下次循 ...
- JDK 9 & JDK 10 新特性
JDK 9 新增了不少特性,官方文档:https://docs.oracle.com/javase/9/whatsnew/toc.htm#JSNEW-GUID-527735CF-44E1-4144-9 ...
- Java中的继承、封装、多态的理解
Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extend ...
随机推荐
- Linux设备模型 (1)
随着计算机的周边外设越来越丰富,设备管理已经成为现代操作系统的一项重要任务,这对于Linux来说也是同样的情况.每次Linux内核新版本的发布,都会伴随着一批设备驱动进入内核.在Linux内核里,驱动 ...
- 洛谷 P1541 乌龟棋 —— DP
题目:https://www.luogu.org/problemnew/show/P1541 DP. 代码如下: #include<iostream> #include<cstdio ...
- codeforces 447 A-E div2 补题
A DZY Loves Hash 水题 #include<iostream> #include<cstdio> #include<cstdlib> #include ...
- 【黑金教程笔记之004】【建模篇】【Lab 03 消抖模块之一】—笔记
设计思路: (1) 一旦检测到按键资源按下(从高电平到低电平),“电平检测模块”就会拉高H2L_Sig电平,然后拉低. (2) “10ms延迟模块”检测到H2L_Sig高电平, ...
- 【黑金教程笔记之002】【建模篇】【Lab 01 永远的流水灯】—笔记&勘误
学习并行操作的思想. 勘误001: Page 17,模块图下方,“扫描频配置定为100Hz”应为10Hz. 勘误002: Page 17,最后一行 “10ms”应为100ms:“2.5ms”应为25m ...
- bzoj 3144 [Hnoi2013]切糕【最小割+dinic】
都说了是'切'糕所以是最小割咯 建图: 每个点向下一层连容量为这个点的val的边,S向第一层连容量为inf的边,最后一层向T连容量为自身val的边,即割断这条边相当于\( f(i,j) \)选择了当前 ...
- P4324 [JSOI2016]扭动的回文串
传送门 对\(A\).\(B\)串各跑一遍\(manacher\),求出第\(1\).\(2\)类扭动回文串的最大长度. 考虑第三类的扭动回文串\(S(i,j,k)\),一定可以表示为\(A(i,l) ...
- libcurl在centos6.4 64位操作系统上不支持https的解决方案
rpm -e –nodeps 软件名 例如: 使用yum install nginx 安装了nginx, 这是如果直接使用yum remove nginx 的话,会把依赖的一些包也删掉, 所以要使用r ...
- [转]广义正交匹配追踪(gOMP)
广义正交匹配追踪(Generalized OMP, gOMP)算法可以看作为OMP算法的一种推广,由文献[1]提出,第1作者本硕为哈工大毕业,发表此论文时在Korea University攻读博士学位 ...
- 51nod 1154 回文串划分
1154 回文串划分 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 有一个字符串S,求S最少可以被划分为多少个回文串. 例如:abbaabaa,有 ...
