【JAVA SE】多态

✨✨欢迎大家来到Celia的博客✨✨

🎉🎉创作不易,请点赞关注,多多支持哦🎉🎉

所属专栏:JAVA

个人主页:Celia's blog~

目录

引言

一、多态

1.1 多态的概念

1.2 多态的实现条件

1.3 关于向上转型、向下转型

1.4 关于重写

1.5 实现多态

1.6 多态的好处


引言

 上一个篇章中,我们已经初步了解了继承的概念以及使用,在本篇文章中,将会介绍在Java中依赖于继承的一种新的现象:多态。

一、多态

1.1 多态的概念

  多态,是指不同的对象,面对同一个事物时,会展现出不同的反应。

1.2 多态的实现条件

  1. 必须在继承体系下
  2. 子类必须重写父类的方法
  3. 通过父类的引用来调用重写的方法

1.3 关于向上转型、向下转型

  在继承体系中,如果创建了一个子类对象,是可以用父类类型来接收的。假设有如下代码:

class Animal{public String name;public int age;public Animal(String name, int age) {this.name = name;this.age = age;}public void eat(){System.out.println("正在吃饭...");}
}class Dog extends Animal{public String flag;public Dog(String name, int age) {super(name, age);}public void eat(){System.out.println("正在吃狗粮...");}
}

我们创建一个dog对象,是可以用Animal类型来接收的:

Animal animal = new Dog("小黑", 10);

那么为什么要这样做呢? 

父类的类型可以接收所有继承于这个父类的子类的对象,这有助于统一标准。此时这种情况就叫做向上转型。

向上转型的三种方式:

  1. 在创建新对象时用父类类型接收
  2. 利用传参,传入子类,用父类接收
  3. 利用方法返回值,返回子类,用父类接收

注意事项:

在继承过程中,如果实现了向上转型,该对象只能使用父类的成员变量或成员方法,这是由类型所局限的。

 

如果想要访问子类的成员变量和成员方法,则需要向下转型:

((Dog) animal).flag//向下转型访问子类成员

1.4 关于重写

  重写,也称为覆盖。是子类对父类的非静态、非private、非final、非构造方法进行的重新编写。返回值和形参列表(种类、顺序)必须一样。只有内容可以改变。我们来看下面的代码:

class Animal{public String name;public int age;public Animal(String name, int age) {this.name = name;this.age = age;}public void eat(){System.out.println("正在吃饭...");}
}class Dog extends Animal{public String flag;public Dog(String name, int age) {super(name, age);}public void eat(){System.out.println("正在吃狗粮...");}
}public class Text {public static void main(String[] args) {Animal animal = new Dog("小黑", 10);/向上转型animal.eat();//会输出什么呢???}
}


我们仔细观察,发现子类Dog和父类Animal都有一个相同的方法:eat,它们的返回值相同,参数列表相同,此时,子类中的eat方法就对父类中的eat方法进行了重写当我们调用父类的eat方法时,实际上调用的是子类的eat方法。


实际上,调用的确实是父类的eat方法,但是在程序运行的过程中,实际上调用的是子类的eat方法,这种在继承体系下,运行时才确定具体调用哪个方法的现象叫做动态绑定。

1.5 实现多态

class Animal{public String name;public int age;public Animal(String name, int age) {this.name = name;this.age = age;}public void eat(){System.out.println("正在吃饭...");}
}class Dog extends Animal{public String flag;public Dog(String name, int age) {super(name, age);}public void eat(){System.out.println("正在吃狗粮...");}
}class Cat extends Animal{public Cat(String name, int age) {super(name, age);}public void eat() {System.out.println("正在吃猫粮...");}
}public class Text {public static void main(String[] args) {Animal animal = new Dog("小黑", 10);Animal animal1 = new Cat("小白",5);animal.eat();animal1.eat();}
}

在以上代码中,定义了两个子类Cat和Dog,进行向上转型,并且调用父类的eat方法:

此时,调用的都是父类的eat方法,但是根据子类对象的不同,实际上展现出来的表现也不同,这种现象就叫做多态。

1.6 多态的好处

  1. 避免使用大量的if-else语句:只需要调用父类的方法,根据对象的不同,就能实现不同的表现形式。
  2. 可扩展能力强:如果想要扩展,只需要定义一个新的继承该父类的类,并且重写父类的方法就可以了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/19512.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入探讨 Android 的 View 显示过程与源码分析

文章目录 1. 探讨 Android 的 View 显示过程1.1. onFinishInflate1.2. onAttachedToWindow1.3. onMeasure1.4. onSizeChanged1.5. onLayout1.6. onDraw 2. 系统代码分析1.1. onFinishInflate1.2. onAttachedToWindow1.3. onMeasure1.4. onSizeChanged1.5. onLayout1.6. onDraw …

数字化浪潮中的TPM革新:打造高效生产新范式

在数字化浪潮席卷全球的今天,传统生产管理模式正面临前所未有的挑战与机遇。TPM(全面生产维护)作为一种先进的生产管理理念,如何在数字化驱动下焕发新的活力,成为制造业转型升级的关键一环。 数字化技术为TPM带来了前…

探秘Flask中的表单数据处理

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、Flask中的表单处理机制 三、Flask表单处理实战 四、处理表单数据的注意事项…

为什么要使用动态代理IP?

一、什么是动态代理IP? 动态代理IP是指利用代理服务器来转发网络请求,并通过不断更新IP地址来保护访问者的原始IP,从而达到匿名访问、保护隐私和提高访问安全性的目的。动态代理IP在多个领域中都有广泛的应用,能够帮助用户…

vue路由跳转之【编程式导航与传参】

vue路由有两种跳转方式 ----> 编程式与声明式,本文重点讲解vue路由的【编程式导航 】【编程式导航传参 ( 查询参数传参 & 动态路由传参 ) 】等内容,并结合具体案例让小伙伴们深入理解 ,彻底掌握!创作不易,需要的…

2023年全球DDoS攻击现状与趋势分析

天翼安全科技有限公司副总工程师、运营保障部总经理陈林表示,2023年扫段攻击频次快速增长,成为网络基础设施面临的最大威胁。为躲避防御,低速扫段攻击成为主流达到攻击总数的73.19%;43.26%的C段攻击持续时间小于5分钟,…

Linux中部署MinIO

Linux中部署MinIO 下载MinIO可执行程序: wget https://dl.min.io/server/minio/release/linux-amd64/minio 添加执行权限: chmod x minio 创建存储目录,例如/data: mkdir -p /data 运行MinIO服务器,需要设置MIN…

【设计模式】JAVA Design Patterns——Factory Method(虚拟构造器模式)

🔍目的 为创建一个对象定义一个接口,但是让子类决定实例化哪个类。工厂方法允许类将实例化延迟到子类 🔍解释 真实世界例子 铁匠生产武器。精灵需要精灵武器,而兽人需要兽人武器。根据客户来召唤正确类型的铁匠。 通俗描述 它为类…

三维前端项目中用THREEWebGLRenderer于创建渲染器对象

在三维前端项目开发中,可以使用THREE.WebGLRenderer创建渲染器对象。艾斯视觉作为行业ui设计与前端开发服务商很高兴能在这里与你共同探讨:THREE.WebGLRenderer是 Three.js 库中用于将 3D 场景渲染到屏幕上的类。以下是一个示例代码,展示了如…

element中table的selection-change监听改变的那条数据的下标

<el-table ref"table" :loading"loading" :data"tableData" selection-change"handleSelectionChange"></el-table>当绑定方法selection-change&#xff0c;当选择项发生变化时会触发该事件 // 多选框选中数据handleSele…

truncate IDL_UB1$导致数据库open hang---惜分飞

在一次数据库恢复中,发现IDL_UB1$表被truncate,然后数据库在open过程中会hang住,而且不报任何错误,这里通过试验进行重现.对于这类问题,以前有过类似处理测试&#xff1a;truncate IDL_UB1$恢复试验数据库版本 SQL> select * from v$version; BANNER ---------------------…

vivado原语使用

首先介绍一下原语&#xff1a;其英文名字为Primitive。原语是Xilinx针对其器件特征开发的一系列常用模块的名字&#xff0c;用户可以将其看成Xilinx公司为用户提供的ip&#xff0c;是芯片中的基本元件&#xff0c;代表FPGA中实际拥有的硬件逻辑单元&#xff0c;如LUT&#xff0…

汇编:x86汇编环境搭建与基础框架(32位)

32位汇编代码编写环境&#xff1a;Visual Studio&#xff08;笔者用的版本为2017&#xff09;&#xff1b;先来说一下在Visual Studio 2017中编写汇编代码的准备操作&#xff1a; ①创建空项目 ②设置项目属性&#xff1a;平台工具集设置为Visual Studio 2015(v140)&#xff0…

YOLOv5改进 | 注意力机制 | 添加三重注意力机制 TripletAttention【原理 + 完整代码】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 得益于在通道或空间位置之间建立相互依赖关系的能力&#xff0c;近年来&#xff0c;注意力机制在计算机视觉任务中得到了广泛的研究和应用。…

嵌入式Linux命令基础

一、命令概述 1. 命令本质 命令的特性&#xff1a;一般就是对应shell命令&#xff0c;每一个命令代表一个可执行程序&#xff0c;运行一个命令就相当于 运行一个可执行代码。 2. 打开终端方法 第一种方法&#xff1a;通过鼠标右键选择打开终端 第二种方法&#xff1a;利用…

Django——Admin站点(Python)

#前言&#xff1a; 该博客为小编Django基础知识操作博客的最后一篇&#xff0c;主要讲解了关于Admin站点的一些基本操作&#xff0c;小编会继续尽力更新一些优质文章&#xff0c;同时欢迎大家点赞和收藏&#xff0c;也欢迎大家关注等待后续文章。 一、简介&#xff1a; Djan…

认识Oracle v$mystat视图

v$mystat就是当前用户的各种统计信息&#xff0c; sid就是session的id(也就是当前用户),STATISTIC#就是统计量的编号(用来唯一确定统计量的名称)&#xff0c;value是统计量的值&#xff1b; desc命令在Oracle中通常用于查看表结构&#xff1b; v$mystat视图中只会有当前用户…

【NVM】nvm常用命令,切换node版本命令

nvm常用的命令&#xff0c;切换node版本命令 nvm 查看支持安装的node版本 nvm list available nvm安装指定版本node nvm install 版本号 例如&#xff1a;nvm install 10.24.1 nvm查看本机安装所有node版本 nvm list nvm切换node版本 nvm use 10.24.1 检测当前node版本 node -…

大数据中的电商数仓项目:探秘业务的核心

我学习完一个电商数仓的项目和电影实时推荐项目&#xff0c;便兴冲冲的去面试大数据开发岗&#xff0c;在面试的时候&#xff0c;面试官总是喜欢问&#xff0c;聊聊你为什么要做这个项目以及你这个项目有哪些业务&#xff1f; 我心想&#xff0c;为什么要做这个业务&#xff1f…

【码银送书第二十期】《游戏运营与出海实战:策略、方法与技巧》

市面上的游戏品种繁杂&#xff0c;琳琅满目&#xff0c;它们是如何在历史的长河中逐步演变成今天的模式的呢&#xff1f;接下来&#xff0c;我们先回顾游戏的发展史&#xff0c;然后按照时间轴来叙述游戏运营的兴起。 作者&#xff1a;艾小米 本文经机械工业出版社授权转载&a…