七:面向对象-->多态(主人带宠物去找医生看病为例)

2023-11-27 11:50

本文主要是介绍七:面向对象-->多态(主人带宠物去找医生看病为例),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

7.1、多态的概念       

        多态:用一个引用类型,使用不同的实例而执行不同操作      

        方法重写是实现多态的基础。

        多态意味着在一次方法调用中根据包含的对象的实际类型(即实际的子类对象)来决定应该调用哪个方法,而不是由用来存储对象引用的变量类型决定的。当调用一个方法时,为了实现多态的操作,这个方法既是父类声明过的,也必须是在子类中重写过的方法。

7.2、主人带宠物去找医生看病为例

        创建一个包,包中有如下类:

        (1)父类Animal类:(父类)

        (2)子类Dog类:(宠物类)

        (3)子类Penguin类:(宠物类)

        (4)主人类Master类:(主人类)

        (5)测试类Test类

        7.2.1、对案例一和案例二进行解析

          如果使用案例1中主人类Master类中给宠物看病的方法,如果此时又需要给XXX宠物看病时,就需要:

        (1)添加XXX类,继承父类Animal类;

        (2)修改主人类Master类,添加给XXX类宠物看病的方法

        解析:

        (1)通过案例1可知,假如又养了100种动物,那么就需要不断创建XXX类,并需要不断的在Master类中添加相应的XXX类宠物看病的方法,造成频繁修改代码,代码可扩展性、可维护性差;

        (2)并且由案例1知:主人要做的事情只需要把宠物送到医院即可,至于怎么看病、看病的方法,就不需要主人去做了!按照案例1所做的话,则主人就完成了给宠物看病的功能,还需要医生干嘛?

        通过上述解析我们就需要使用多态进行优化!如案例2所示通过多态进行优化!

        通过案例1和案例2进行对比,解析多态!

        7.2.2、案例一:(不建议使用)

 

        7.2.3、案例二:(使用多态进行优化)

        上述区别在于:

        (1)在子类Dog类中重写toHospital()方法

        (2)在子类Penguin类中重写toHospital()方法

        (3)在父类Animal类中定义一个去医院看病的toHospital()方法

        (4)在主人类Master类定义方法cure()带宠物去看病

        (5)测试类Test类

 

        7.2.3.1、案例二总结

        

        7.2.4、多态

        如下述代码:

        //会调用Dog类的toHospital()方法,而不是Animal类的toHospital()方法,体现了多态
        master.cure(animal);

//向上转型:父类的引用指向了子类的实例(对象)
//Animal为抽象父类,Dog为子类,Animal中也包含抽象方法toHospital()
Animal animal  = new Dog("旺财", 50, 80, "哈士奇");//会调用Dog类的toHospital()方法,而不是Animal类的toHospital()方法,体现了多态
master.cure(animal);

7.3、向上转型

        7.3.1、向上转型语法格式

        子类向父类的转型称为向上转型。

        向上转型的语法格式如下:

                < 父类型 > < 引用变量名 > = new < 子类型 >

                Animal animal  =  new Dog();   //注:父类为Animal类、子类为Dog类

        例如上述7.2.3 案例二中的测试类Test类-->输出结果一样!

package com.bdqn.demo05;public class Test {public static void main(String[] args) {//创建Master类对象Master master = new Master();//创建宠物类对象Cat cat = new Cat("咪咪", 40, 80, "白色");master.cure(cat);System.out.println(cat.getHealth());//向上转型:父类的引用指向了子类的实例(对象)Animal animal  = new Dog("旺财", 50, 80, "哈士奇");master.cure(animal);}
}

        7.3.2、向上转型的概念

        之前介绍了基本数据类型之间的类型转换,举例如下:

        (1)把int型常量或变量的值赋给double型变量,可以自动进行类型转换。

        

int i = 5;
double d1 = 5;

        (2)把double型常量或者变量的值赋给int型变量,必须进行强制类型转换。

double d2 = 3.14;
int a = (int)d2;

        实际上在引用数据类型的子类和父类之间也存在着类型转换问题,如上述7.2.3 案例二中的测试类Test类中的:

//向上转型:父类的引用指向了子类的实例(对象)
//Animal为抽象父类,Dog为子类,Animal中也包含抽象方法toHospital()
Animal animal  = new Dog("旺财", 50, 80, "哈士奇");//会调用Dog类的toHospital()方法,而不是Animal类的toHospital()方法,体现了多态
master.cure(animal);

        7.3.3、子类转换成父类的规则(向上转型)

        (1)将一个父类的引用指向一个子类对象称为向上转型,系统会自动进行类型转换。

        (2)此时通过父类引用变量调用的方法是子类覆盖或继承了父类的方法,不是父类的方法。

        (3)此时通过父类引用变量无法调用子类特有的方法。

7.4、向下转型

这篇关于七:面向对象-->多态(主人带宠物去找医生看病为例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/427603

相关文章

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。

基于SpringBoot的宠物服务系统+uniapp小程序+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统+原生微信小程序+LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统+LW参考示例 3.基于SpringBoot+Vue的企业人事管理系统+LW参考示例 4.基于SSM的高校实验室管理系统+LW参考示例 5.基于SpringBoot的二手数码回收系统+原生微信小程序+LW参考示例 6.基于SSM的民宿预订管理系统+LW参考示例 7.基于

ffmpeg面向对象-待定

1.常用对象 rtsp拉流第一步都是avformat_open_input,其入参可以看下怎么用: AVFormatContext *fmt_ctx = NULL;result = avformat_open_input(&fmt_ctx, input_filename, NULL, NULL); 其中fmt_ctx 如何分配内存的?如下 int avformat_open_input(

chapter06 面向对象基础 知识点Note

文章目录 前言类的设计 属性和行为对象的内存解析 (堆 栈 方法区)类的成员之一 变量(属性) field类的成员之二 方法 method对象数组方法重载 overload可变个数的形参 语法糖方法的值传递机制递归关键字package importMVC设计模式import导入面向对象特征之一 封装类的成员之三 构造器JavaBeanUML类图 前言 ` 面向对象封装 面向

【JVM】JVM栈帧中的动态链接 与 Java的面向对象特性--多态

栈帧 每一次方法调用都会有一个对应的栈帧被压入栈(虚拟机栈)中,每一个方法调用结束后,都会有一个栈帧被弹出。 每个栈帧中包括:局部变量表、操作数栈、动态链接、方法返回地址。 JavaGuide:Java内存区域详解(重点) 动态链接 动态链接:指向运行时常量池中该栈帧所属方法的引用。 多态 多态允许不同类的对象对同一消息做出响应,但表现出不同的行为(即方法的多样性)。 多态

Matlab/Simulink和AMEsim联合仿真(以PSO-PID算法为例)

目录 安装软件和配置环境变量 Matlab/Simulink和AMEsim联合仿真详细流程 非常重要的一点 Simulink模型和AMEsim模型用S-Function建立连接 从AMEsim软件打开Matlab Matlab里的设置 Matlab的.m文件修改(对于PSO-PID算法) 运行程序 我印象中好像做过Matlab/Simulink和AMEsim联合仿真的分享似的

看病要排队这个是地球人都知道的常识

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝唯有付出,才有丰富的果实收获! 看病要排队这个是地球人都知道的常识。 不过经过细心的0068的观察,他发现了医院里排队还是有讲究的。0068所去的医院有三个医生(汗,这么少)同时看病。而看病的人病情有轻重,所以不能根据简单的先来

java基础总结15-面向对象11(抽象类)

下面通过一下的小程序深入理解抽象类 因此在类Animal里面只需要定义这个enjoy()方法就可以了,使用abstract关键字把enjoy()方法定义成一个抽象方法,定义如下:public abstract void enjoy();   从某种意义上来说,抽象方法就是被用来重写的,所以在父类声明的抽象方法一定要在子类里面重写。如果真的不想在子类里面重写这个方法,那么可以再在子类里

java基础总结14-面向对象10(多态)

面向对象最核心的机制——动态绑定,也叫多态 1 通过下面的例子理解动态绑定,即多态 package javastudy.summary;class Animal {/*** 声明一个私有的成员变量name。*/private String name;/*** 在Animal类自定义的构造方法* @param name*/Animal(String name) {this.name = n

java基础总结13-面向对象9(对象转型)

对象转型分为两种:一种叫向上转型(父类对象的引用或者叫基类对象的引用指向子类对象,这就是向上转型),另一种叫向下转型。转型的意思是:如把float类型转成int类型,把double类型转成float类型,把long类型转成int类型,这些都叫转型。把一种形式转成另外一种形式就叫转型。除了基础数据类型的转型之外(基础数据类型的转型:大的可以转成小的,小的也可以转成大的。),对象领域里面也有对象之