【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.hqwc.cn/news/512993.html

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

相关文章

Tomcat概念、安装及相关文件介绍

目录 一、web技术 1、C/S架构与B/S架构 1.1 http协议与C/S架构 1.2 http协议与B/S架构 2、前端三大核心技术 2.1 HTML(Hypertext Markup Language) 2.2 css(Cascading Style Sheets) 2.3 JavaScript 3、同步和异步 4、…

学习JAVA的第十三天(基础)

目录 API之Arrays 将数组变成字符串 二分查找法查找元素 拷贝数组 填充数组 排序数组 Lambda表达式 集合的进阶 单列集合 体系结构 Collection API之Arrays 操作数组的工具类 将数组变成字符串 //将数组变成字符串char[] arr {a,b,c,d,e};System.out.println(Arra…

【开源】SpringBoot框架开发用户画像活动推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活动档案模块2.4 活动报名模块2.5 活动留言模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 数据流程设计3.4 E-R图设计 四、系统展示五、核心代码5.1 查询兴趣标签5.2 查询活动推荐…

前后端分离项目Docker部署指南(下)

目录 前言: 一.安装nginx 创建目录 上传nginx.conf至/data/nginx/conf文件夹中 运行启动容器 上传静态资源文件 ​编辑 访问结果 前言: 在上一篇博客中,我们深入探讨了如何使用Docker部署一个前后端分离的项目中的后端部分。我们构建…

HTML极速入门

HTML基础 什么是HTML HTML(Hyper Text Markup Language),超文本标记语言. 超文本:比文本更强大.通过链接和交互式方式来组织和呈现信息的文本形式.不仅仅有文本,还可能包括图片,音频,或者自己经审阅过它的学者所加的评注,补充或脚注等. 标记语言:由标签构成的语言 HTML的标…

数据链路层----滑动窗口协议的相关计算

目录 1.窗口大小的相关计算 •停等协议: •后退N帧协议: •选择重传协议: 2.信道利用率相关计算 •停等协议的信道利用率: •连续ARQ(后退N帧协议,选择重传协议)的信道利用率:…

Python+Vue全栈开发BI数据可视化项目

如何得到这样一个大屏可视化展示 数据清洗,运算,建模,分析,可视化

【MGR】MySQL Group Replication 管理操作

目录 17.5 Group Replication Operations 17.5.1 Deploying in Multi-Primary or Single-Primary Mode 17.5.1.1 Single-Primary Mode 17.5.1.2 Multi-Primary Mode 17.5.1.3 Finding the Primary 17.5.2 Tuning Recovery Donor Selection (数据源选择) Enhanced Automa…

【TEE】内存完整性保护

Hash Functions&Merkle Tree 对读操作进行完整性检查,通过在加载的块上重新计算一个哈希,然后根据片外地址将得到的哈希与片上哈希比较。 缺点:不可承受的片上存储开销,并假设128位哈希和512位cache line,其开销为…

SQL技巧笔记(一):连续3人的连号问题—— LeetCode601.体育馆的人流量

SQL 技巧笔记 前言:我发现大数据招聘岗位上的应聘流程都是需要先进行笔试,其中占比很大的部分是SQL题目,经过一段时间的学习之后,今天开了一个力扣年会员,我觉得我很有必要去多练习笔试题目,这些题目是有技…

光伏发电预测

XGB、LGB在datacamp(学习网站) data fountain与国家电投系列赛,光伏发电预测 题目:给一组特征,预测瞬时发电量,训练集9000个点,测试集8000个点,特征包含光伏板的属性和外部环境等。 数据字段:ID、光伏电池板背侧温度、光伏电站现场温度、计算得到的平均转换效率、数…

记录前端面试的一些笔试题(持续更新......)

文章目录 js相关数组去重数组对象去重 实现数组unshift数组扁平化tree型数据扁平化list数据转tree型数据 对象深拷贝防抖/节流函数柯里化函数管道 随便记录一些,面试或者工作中都会用到,实现的方法很多,这里只是一小部分,有更好的…