【JavaSE】面向对象——多态性

多态性

多态性的概念

所谓多态性,理解为一个事物的多种形态。具体点就是去完成某个动作时,不同的对象会产生不同的状态。

多态性的好处

多态在Java中指的是父类的引用指向子类的对象,或者可以说是子类的对象赋给父类的引用。这样在我们的实际开发中,就可以使用不同子类的对象赋给相同的父类,在不改变代码结构的情况下,动态的扩展和切换对象的行为,使得代码更高效。

如何实现多态性

简而言之,就是父类的引用指向子类的对象   或者   子类的对象赋给父类的引用。

public class Animal {}public class Dog extends Animal{}public class Main {public static void main(String[] args) {Animal dog  = new Dog();}}

实现原理

动态绑定

动态绑定,指的是在编译时期只知道变量的声明类型,但是无法确定实际的对象类型。在运行时,JVM会解析实际对象的类型。这意味着,直到运行时,才可以确定调用的实际方法。正是这种动态绑定机制,才使得多态成为可能。

静态绑定:在编译时期就可以确定所要调用的具体类型,且在运行时期保持不变。

虚方法调用

虚方法调用是在运行时根据实际对象的类型来确定要调用哪个方法的机制,而无法在编译时确定具体的调用方法。在多态的情况下,子类重写了父类的A方法,此时A方法就被称为虚方法,在运行时,虚拟机根据实际的子类对象,来动态调用属于子类的A方法。像A方法这样的方法在编译时是无法确定具体调用哪个方法,只有真正运行时才确定。

在多态的场景下,调用方法时:

编译时,认为是左边声明的父类类型的方法;

运行时,认为是右边声明的子类重写的方法。

简称为:编译看左边,运行看右边。

多态性的使用前提

1. 要有类的继承关系。

2. 方法重写,没有方法的重写也可以实现多态性,但是从多态性的现实意义来说,不重写方法的多态性是没有意义。

多态性的好处和弊端

好处

1. 开发中:使用父类做方法的形参,是多态使用最多的场合。即使增加了新的子类,方法也无需改变,提高了扩展性。

2. 多态无处不在,在后续的抽象类和接口中,本身是不能定义对象的,只有其的子类才能定义对象,这无疑是多态的体现。

3. 变量引用的子类对象不同,执行的方法就不同,实现动态绑定。代码编写更灵活、功能更强大,可维护性和扩展性更好了。

弊端

在多态的场景下,我们创建了子类的对象,在内存中加载了子类特有的方法和属性。但是由于声明为父类的引用,导致我们并没有办法调用子类特有的属性和方法。

多态的适用性

多态适用于方法,不适用于属性。

实现多态之后,如果直接调用属性,发现值是父类的;如果使用方法调用属性,发现值是子类的。其实,这就是静态绑定和动态绑定的问题了。

Java为了实现多态这个机制,选择让方法在运行时绑定对应的类型,属性在编译时期绑定对应的类型。因此,属性绑定的是父类的值,而方法绑定的是子类对象的值。

当直接调用属性时,调用到的是父类的属性,正是由于属性在编译期间绑定,而多态编译期间的变量是父类类型,因此绑定的就是父类的属性值。

当使用方法调用属性时,调用到的是子类的属性,使用super.属性除外。重写方法在运行期间确定对应的地址,也就是动态绑定。而使用子类的方法时,由于默认前边有this.,因此调用的就是子类的属性,这也正好说明了为啥调用super.除外。

所谓多态性,就是一个事物的多种状态,即不同的对象去完成相同的动作时会产生不同的状态。而我认为在实际开发中,多态的体现更多在接口和抽象类中,因为在大多数场景下,其实属性和未重写的方法并没有什么作用。利用抽象类和多态可以让在不修改代码结构的场景下,动态的扩展和切换对象的行为,从而使代码更高效。谈完多态的概念和实际开发场景,多态的实现原理也应该是一个比较重要的内容,其利用动态绑定和虚方法调用的底层实现,从而可以让多态称为现实。

重写属于动态多态,而重载属于静态多态。

向上转型 / 向下转型  

向上转型就是多态,而向下转型则是先通过向上转型之后,再向下强转。如下图:

 

2fc6a3c6868c427b830810681946b042.png

向上转型一般是不存在问题的,而向下转型就不一定了。由于Java的继承是单继承性,只有一个父类,但是一个父类却有很多子类。因此当向下转型时,我们就需要考虑可能会出现类型转换异常。建议在向下转型之前,使用instanceof关键字进行判断,避免出现类型转换异常。instanceof的使用格式是:对象名 instanceof 类名。对于instanceof来说,只要对象对应的类是该类的子类即可。 

 

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

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

相关文章

SpringBoot实现分页模糊查询

1. Navicat查询数据 Navicat中查询所有数据 SELECT * FROM sys_user;Navicat中查询前两条数据(俩种方式) SELECT * FROM sys_user LIMIT 2; //从0开始,第一个参数是起始位置即(pageNum-1)*pageSize,第二个参数是步长 SELECT * …

项目部署后 通过公网IP访问不到的问题解决

目录 1.检查项目是否在运行(第二行命令) 2.检查所用服务器防火墙是否打开 3.检查linux系统防火墙有没有打开 问题如图: 首先确保项目已经成功部署 1.检查项目是否在运行(第二行命令) 第一行命令是监听58080端口,我的项目是使用该端口 2.检查所用云服务器防火墙是否打开 我…

分享77个Html杂七杂八模板,总有一款适合您

分享77个Html杂七杂八模板,总有一款适合您 77个Html杂七杂八模板下载链接:https://pan.baidu.com/s/1-RyIKaxdCu3dbnlMFMwviw?pwd8888 提取码:8888 学习知识费力气,收集整理更不易。知识付费甚欢喜,为咱码农谋福…

每日好题3.5

前缀和 这个题目巨妙,打的时候没写出来,后面补题发现太牛了 思路:当前区间左端点 L L L ,当我们向右移动一次,就相当于,原式 - f ( L ) f ( L 1 e 18 ) f(L) f(L 1e18) f(L)f(L1e18),值就…

linuxOPS基础_服务器构成

服务器的重要结构组成 家用电脑组成: CPU、主板、内存条、显卡、硬盘、电源、风扇、网卡、显示器、机箱、键盘鼠标等等。 CPU CPU是电脑的大脑, CPU发展史: 32 位CPU:最大的内存寻址地址2^32,大约4G的大小。 CP…

CSS3新特性

简介 继CSS2之后,CSS3增加了很多新的特性,虽然W3C仍在规范中,但是很多新的CSS3属性已经在很多现代浏览器中得到了支持。 CSS3边框 在CSS3中,可以创建圆角边框,添加边框阴影,设置边框图片,利用…

计算机组成原理之机器:计算机系统的基本概念

计算机组成原理之机器 笔记来源:哈尔滨工业大学计算机组成原理(哈工大刘宏伟) Chapter1:计算机系统的基本概念 1.1 计算机系统简介 从物理构成的角度对计算机系统分层 计算机组成原理主要关注微体系结构(Mirco-arc…

【无标题】计算机主要应用于哪些领域

科学计算(或称为数值计算)、数据处理(信息管理)、辅助工程、生产自动化、人工智能。1、科学计算(或称为数值计算):早期的计算机主要用于科学计算。目前,科学计算仍然是计算机应用的一…

【原理图PCB专题】Allegro模块化移动器件报...has the LOCKED property怎么解锁?

在模块化原理图时,PCB也需要做一个模块.mdd文件。这时需要先画好图纸然后再制作模块化文件。 修改文件时会发现模块化器件报错,无法编辑模块内部器件和走线,器件和走线都被LOCKED,如下所示报错内容: Symbol "U1" Selected Cannot edit Symbol "U1". M…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:组件标识)

id为组件的唯一标识,在整个应用内唯一。本模块提供组件标识相关接口,可以获取指定id组件的属性,也提供向指定id组件发送事件的功能。 说明: 从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容…

代码随想录算法训练营第九天

28. 实现 strStr() &#xff08;本题可以跳过&#xff09; 方法&#xff1a; 方法一&#xff1a; 暴力法 i 表示最多能移动到n-m位置&#xff0c; 超过则退出循环。j表示haystack 初始位置k表示needle的初始位置如果haystack [j] needle[k]且 k<m 则 j, k; 如果 km 则返…

OJ输入问题+准备

写在之前&#xff1a; 发现题目输入是这样的&#xff1a; 我的问题&#xff1a;如何通过空格分割这些输入的字符串并分别保存&#xff01;&#xff01;&#xff08;C语言scanf好解决一点但我选择C....&#xff09; C引入了ostringstream、istringstream、stringstream这三个类…

DevOps中集成自动化测试的具体案例

在DevOps中集成自动化测试的具体案例可以从多个角度进行分析,包括金融行业、分布式系统、大型企业等不同领域的实践。以下是几个具体的案例: 金融行业的DevOps实践:在金融行业中,DevOps被广泛应用于提升软件开发和运营的效率。例如,通过解析后台接口代码日志格式,自动化生…

linuxOPS基础_运维概述,及其泛概念

运维岗位定义 什么是运维&#xff1f; ​ 在技术人员&#xff08;写代码的&#xff09;之间&#xff0c;一致对运维有一个开玩笑的认知&#xff1a;运维就是修电脑的、装网线的、背锅的岗位。 ​ IT运维管理是指为了保障企业IT系统及网络的可用性、安全性、稳定性&#xff0…

SPI总线知识总结

1 SPI的时钟极性CPOL和时钟相位CPHA的设置 1.1 SPI数据传输位数 SPI传输数据过程中总是先发送或接收高字节数据&#xff0c;每个时钟周期接收器或发送器左移一位数据。对于小于16位的数据&#xff0c;在发送前必须左对齐&#xff0c;如果接收的数据小于16位&#xff0c;则采用软…

汽车碰撞与刮伤的实用维修技术,汽车的车身修复与涂装修补教学

一、教程描述 本套汽车维修技术教程&#xff0c;大小7.44G&#xff0c;共有60个文件。 二、教程目录 01-汽车车身修复教程01-安全规则&#xff08;共3课时&#xff09; 02-汽车车身修复教程02-汽车结构&#xff08;共3课时&#xff09; 03-汽车车身修复教程03-汽车修复所使…

为什么Spring Cloud 应用程序中,应用程序的加载配置必须写在bootstrap.yaml这个配置文件中,是在哪里规定的?

在 Spring Cloud 应用程序中&#xff0c;bootstrap.yaml&#xff08;或bootstrap.properties&#xff09;的使用并非强制性的&#xff0c;但它扮演着一个特定的角色&#xff0c;主要是因为 Spring Cloud 的设计和工作流程。 背景和设计 Spring Cloud 构建在 Spring Boot 之上…

鸿蒙 Stage模型-应用组件-配置、UIAbility

前提&#xff1a;基于官网3.1/4.0文档。参考官网文档 基于Android开发体系来进行比较和思考。&#xff08;或有偏颇&#xff0c;自行斟酌&#xff09; 一、概念 可以看到分为运行期、编译器&#xff0c;主要关注UIAbility&#xff08;类似Activity&#xff0c;UI相关&#xff0…

2024年软考-官方最新考试安排出来了,软考新调整,很重要,但也很惹人气愤

官方最新通知&#xff0c;关于2024年度计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试工作计划 笔试改机考后&#xff0c;必然会迎来调整&#xff0c;但有点让人费解。 这次调整变动主要是每年考试的次数调整&#xff0c;很多改为了一年一考&#xff0c;具体…

Claude 3 模型发布,压力来到OpenAI这边了~

Anthropic 发布了 Claude 3 系列&#xff0c;包含了三款模型 各具特色&#xff0c;旨在为用户提供更智能、更快速、更高效的选择&#xff0c;可以说是是迄今为止最快、最强大的人工模型&#xff01; Anthropic 一度是 OpenAI 最强力的竞争对手&#xff01; 随着 Claude3 的发…