第二节 什么是多态

主讲人:王少华       QQ群号:483773664

一、 子类到父类的转换(向上转型)

(一)  基本数据之间的类型转换

1. 自动进行类型转换

//将int型常量或变量的值赋给double型变量,可以自动进行类型转换

int i = 5;

double dl = i;

2. 强制类型的转换

类型转换运算符是小括号,类型转换运算符的用法是

(type)variable

//将double型常量或变量的值赋给int型变量,进行强制类型转换

double d2 = 3.14;

int a = (int) d2;

3. 基本数据类型转换注意事项

基本类型之间的转换只能在数值类型之间进行,这里所说的数值类型包括:整数型、字符型和浮点型。但数值类型和布尔类型之间不能进行类型转换。

(二)  引用数据类型转型

数据类型转换不但存在于基本数据类型之间,还存在于引用类型之间,但引用数据类型转型存在一些规则

1. 引用类型之间的转换只能在具有继承关系的两个类这间进行。

Person person = new Dog();  //Error

2. 将一个父类引用指向一个子类对象,称为向转型(upcasting),自动进行类型转换。

Pet pet = new Dog();

二、 使用父类作为方法形参

用父类作为方法的形参,是Java中实现和使用多态的主要方式之一。

(一)  解决给宠物喂食的难题

1. Master

修改Master类,注释feed(Dogdog)和feed(Penguin penguin)方法,增加唯一的feed(Pet pet)方法,如下所示

publicclass Master {

private String name = "";// 主人名字

privateintmoney = 0; //元宝数

/**

* 有参构造方法。

*

* @param name

*           主人名字

* @param money

*           元宝数

*/

public Master(String name, int money) {

this.name = name;

this.money = money;

}

publicvoid setName(String name) {

this.name = name;

}

publicvoid setMoney(int money) {

this.money = money;

}

publicint getMoney() {

returnmoney;

}

public String getName() {

returnname;

}

/**

* 主人给宠物喂食。

*/

publicvoid feed(Pet pet) {

pet.eat();

}

}

2. Test:测试类

publicclass Test {

publicstaticvoid main(String[] args) {

Dog dog = new Dog("欧欧", "雪娜瑞");

Penguin pgn = new Penguin("楠楠", "Q妹");

dog.setHealth(80); // 设置健康值,以便正常喂食

pgn.setHealth(80); // 设置健康值,以便正常喂食

Master master = new Master("王先生", 100);

master.feed(dog);// 主人给狗狗喂食

master.feed(pgn);// 主人给企鹅喂食

}

}

备注:

  • 向上转型的规则:通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法;
  • 使用多态的好处:减少代码量,提高代码的可扩展性。
  • 验证:多态的扩展性

增加宠物Cat类,继承Pet类并重写eat()y方法

publicclass Cat extends Pet{

private String color;//颜色

public Cat(String name, String color) {

super(name);

this.color = color;

}

publicvoid setColor(String color) {

this.color = color;

}

public String getColor() {

returncolor;

}

/**

*  实现吃饭方法

*/

publicvoid eat() {

if(getHealth()>=100){

System.out.println("狗狗"+this.getName() +"吃饱了,不需要喂食了!");

}else{

this.setHealth(this.getHealth()+4);

System.out.println("猫咪"+this.getName() + "吃饱啦!体力增加4。");

}

}

}

4. Test:添加领养和喂食猫的语句

publicclass Test {

publicstaticvoid main(String[] args) {

Dog dog = new Dog("欧欧", "雪娜瑞");

Penguin pgn = new Penguin("楠楠", "Q妹");

Cat cat = newCat("Tomcat", "黄色");

dog.setHealth(80); // 设置健康值,以便正常喂食

pgn.setHealth(80); // 设置健康值,以便正常喂食

cat.setHealth(80); // 设置健康值,以便正常喂食

Master master = new Master("王先生", 100);

master.feed(dog);// 主人给狗狗喂食

master.feed(pgn);// 主人给企鹅喂食

master.feed(cat);// 主人给猫喂食

}

}

(二)  父类调用子类特有方法

1. 需求:

假设主要可以同时给狗和企鹅喂食,但只能和狗玩飞盘游戏,只能和企鹅玩游泳游戏。

  • 给Penguin类添加swim方法
  • 实现:

给Dog类添加catchingFlyDisc()

publicvoid catchingFlyDisc(){

if(super.getLove()>=100){

super.setLove(100);

}else {

super.setLove(super.getLove()+10);

}

}

在测试类中,通过Pet调用Dog类中的cathingFlyDisc

3. 原因及结论

因为主人类只晓得它是一个宠物,而不知道它是狗还是企鹅,所以主人不知道应该跟这个宠物玩什么游戏。因此,在多态中,通过父类引用变量无法调用子类特有的方法

三、 使用父类作为方法返回值

使用父类作为方法的返回值,是Java中实现和使用多态的另一种方式。

(一)  需求

以使用父类作为方法返回值的方式,来实现主人领养宠物的功能

  • 给Master类添加getPet(String typeId)方法,实现领养功能
  • 创建测试类,根据主人选择宠物的类型编号来领养宠物
  • 调用给宠物喂食,测试是否正确领养
  • 实现

  • Master

修改Master类添加getPet(StringtypeId)方法,以父类Pet作为方法返回值。

/**

* 主人领养宠物

* @param typeId 宠物编号

* @return

*/

public Pet getPet(int typeId){

Pet pet=null;

if(typeId==1){

pet= new Dog("欧欧", "雪娜瑞");

}elseif(typeId==2){

pet  = newPenguin("楠楠", "Q妹");

}

returnpet;

}

2. Test

在Test类中,添加领养信息

publicclass Test {

publicstaticvoid main(String[] args) {

Master master = new Master("王先生", 100);

Scanner input = new Scanner(System.in);

System.out.println("欢迎您来到宠物店!");

System.out.print("请选择要领养的宠物类型:(1、狗狗 2、企鹅)");

int typeId = input.nextInt();

Pet pet = master.getPet(typeId);

if (pet != null) {

System.out.println("领养成功!");

pet.setHealth(80); //设置健康值,以便正常喂食

master.feed(pet);

} else {

System.out.println("对不起,没有此类型的宠物,领养失败");

}

}

}

四、 总结

(一)  实现多态的条件

通过以上示例对多态功能的详解,总结实现多态的3个条件

  • 继承的存在,继承是多态的基础,没有继承就没有多态
  • 子类重写父类方法,多态下调用子类重写后的方法
  • 父类引用变量指向子类对象,子类到父类的类型转换
  • 多态中的方法

  • 通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法
  • 通过父类引用变量无法调用子类特有的方法
时间: 2024-10-31 15:41:17

第二节 什么是多态的相关文章

【软件构造】第五章第二节 设计可复用的软件

第五章第二节  设计可复用的软件 5-1节学习了可复用的层次.形态.表现:本节从类.API.框架三个层面学习如何设计可复用软件实体的具体技术. Outline 设计可复用的类--LSP 行为子结构 Liskov替换原则(LSP) 各种应用中的LSP 数组是协变的 泛型中的LSP 为了解决类型擦除的问题-----Wildcards(通配符) 设计可复用的类--委派与组合 设计可复用库与框架 Notes ## 设计可复用的类--LSP 在OOP之中设计可复用的类 封装和信息隐藏 继承和重写 多态.子

杨森翔:春节文化大观上编 第三章 春节古诗词 目录 第一节:春节诗词概述 一、 除夕诗词概述 二、元日诗词概述 三、 元宵诗词概述 第二节:春节古诗词拾萃

杨森翔:春节文化大观上编 第三章 春节古诗词 目录 第一节:春节诗词概述 一. 除夕诗词概述 二.元日诗词概述 三. 元宵诗词概述 第二节:春节古诗词拾萃 一.腊祭诗词 二.祭灶诗词 三.除夕诗词 四.元旦诗词 五.人日诗词 六.元宵诗词 第一节:春节古诗词概述 中国的春节,作为除旧迎新的节日,时间相当长,从年前的腊月二十三,天空中就似乎弥漫了节日的气息.这种节日的气氛,在保持传统风俗较好的地方,甚至会持续到二月二龙抬头的时候,但欢度春节的高潮,应该说是自除夕始一直到上元之夜.因此,历代歌咏和反

centos单用户 救援 运行级别 第二节课

centos单用户 救援 运行级别 第二节课 yum工具在minimal安装级别就已经安装 yum list:列出远程服务器端的所有的包的列表 安装桌面套件,安装图形化桌面 yum groupinstall -y "desktop"yum groupinstall -y "X window system" 临时显示英文 LANG=en

第二节 分支结构

在程序开发中,分支结构的使用频率要多于循环结构,10次分支,4次循环. 程序开发三种情况:分支,循环,分支 (1) if的三种格式: int a = 10; if(a > o) { printf("%d",a) } 当条件表达式的条件成立时,或为真时,执行大括号内的语句,否则执行if之后的语句. (2) char sex = 0; printf("请输入你的性别:m或者f"); scanf("%c",&sex); if(sex ==

Centos7 Openstack - (第二节)添加认证服务(Keystone)

Centos7 install Openstack - (第二节)添加认证服务(Keystone) 我的blog地址:http://www.cnblogs.com/caoguo 根据openstack官方文档配置 官方文档地址: http://docs.openstack.org/juno/install-guide/install/yum/content/# 0x01.认证服务安装与配置(控制节点) [[email protected] ~]# mysql -uroot -p MariaDB

第二节 Java Swing中的基本容器:JFrame

第二节 基本容器:JFrame 如果要使用Swing创建一个窗口,则直接使用JFrame即可,此类事Component类的子类,常用方法如下: 小试牛刀 创建一个简单的窗口 import java.awt.*; import java.io.*; import javax.swing.*; public class JavaSwingTest { public static void main(String args[]) throws IOException{ test1(); } //创建一

第二节 什么是接口

什么是接口 主讲教师:王少华     QQ群号:483773664 学习目标 掌握接口的定义与使用 理解接口与抽象类的区别 一.什么是接口 现实生活中,我们经常听到接口这个词,比如USB接口,那它是什么意思呢?我们拿USB接口为例,不管那个厂商生产的USB存储器,我们都可以通过USB接口让电脑识别出来,这是为什么呢?这是因为这些生产厂商遵循了一套相同的标准,并按照这个标准来生成USB设备. 在软件中,接口同样是一种规范和标准,它们可以约束类的行为,是一些方法特征的集合,但是没有方法的实现.因此,

《Pro Android Graphics》读书笔记之第二节

Android Digital Video: Formats, Concepts and Optimization Android Digital Video Formats: MPEG4 H.264 and WebM VP8 H.263 支持老显示器 MPEG4 SP   supported for commercial video(支持商业视频) 3GP Google在2.3.3中加入对WebM的支持 video Stream 4.0以后版本 recommend using MPEG-4 H

​【v2.x OGE-example 第二节】 实体参数

[v2.x OGE-example 第二节] 实体参数 1. 位置:Drawing_example --> SpriteParameters 2. 类名:SpriteParameters (1)旋转精灵: sprite.setRotation(float pRotation) 设置旋转角度 sprite.setRotationCenter(float pRotationCenterX, float pRotationCenterY)//设置旋转的中心点(以某个点为中心旋转) sprite.set