【剧前爆米花--爪哇岛寻宝】面向对象的三大特性——封装、继承以及多态的详细剖析(中——多态)。

news/2024/5/17 20:09:19/文章来源:https://blog.csdn.net/m0_62815572/article/details/128118015

作者:困了电视剧

专栏:《JavaSE语法与底层详解》

文章分布:这是一篇关于Java面向对象三大特性——多态的文章,在本篇文章中我会分享多态的一些基础语法以及类在继承时代码的底层逻辑和执行顺序。

目录

多态的定义及实现条件

多态的概念

多态的实现条件

方法重写

重写的规则和与重载的对比

静态绑定

动态绑定

向上转型和向下转型

向上转型

向下转型

多态的优点和注意事项


多态的定义及实现条件

class Animal{String name;int age;String sex;public void eat(){System.out.println("吃饭");}public void sleep(){System.out.println("睡觉");}}class Cat extends Animal{public void eat(){System.out.println("吃狗粮");}
}class Dog extends Animal{public void eat(){System.out.println("吃猫粮");}
}

以这段代码作为栗子。 

多态的概念

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同 的状态。总的来说:同一件事情,发生在不同对象身上,就会产生不同的结果。

多态在上述栗子的体现中就是Animal都有吃饭这一行为,但在猫和狗中就体现了不同的状态,即狗吃狗粮,猫吃猫粮。

多态的实现条件

1. 必须在继承体系下

2. 子类必须要对父类中方法进行重写

3. 通过父类的引用调用重写的方法

多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法。

在上述栗子中,我的Cat类和Dog类都继承了Animal 类,同时在子类中我又对父类中的eat方法进行了重写,最后我只需要在main函数中用父类的引用调用子类重写的方法即可,这样一个Animal就可以根据我的需要既表现出Cat的eat行为,又表现出Dog的eat行为,从而实现了多态。

方法重写

重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程 进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定 于自己的行为。 也就是说子类能够根据需要实现父类的方法。

重写的规则和与重载的对比

1.子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完全一致

2.被重写的方法返回值类型可以不同,但是必须是具有父子关系的 

3.访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方 法就不能声明为 protected

4.父类被static、private修饰的方法、构造方法都不能被重写。

5.重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验. 例如不小心 将方法名字拼写错了 (比如写成 aet), 那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法 构成重写.

静态绑定

静态绑定:也称为前期绑定(早绑定),即在编译时,根据用户所传递实参类型就确定了具体调用那个方法。典型代 表函数重载。

动态绑定

动态绑定:也称为后期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体 调用那个类的方法。

public class Javabit_Code {public static void main(String[] args) {Animal an1=new Cat();an1.eat();System.out.println("==============");Animal an2=new Dog();an2.eat();}
}class Animal{String name;int age;String sex;public void eat(){System.out.println("吃饭");}public void sleep(){System.out.println("睡觉");}}class Cat extends Animal{public void eat(){System.out.println("吃猫粮");}
}class Dog extends Animal{public void eat(){System.out.println("吃狗粮");}
}

以这段代码为例,当程序在进行编译的时候,程序无法确定我们回去调用哪一个eat,只有当程序运行起来的时候程序才会知道,此时程序底层就发生了动态绑定,这里的动态其实也就是运行的意思。我们可以看一下程序的底层逻辑。

我们可以清楚地看到程序在进行编译的时候,由于不知道会调用哪一个子类的重写方法,于是直接调用父类的方法,当程序运行的时候,这个方法再通过动态绑定从而执行指定的子类的方法。

 

对于动态绑定的过程可以简单举例理解为,父类的方法的地址为0x88,编译时将父类方法和地址存储在一个地方A,父类方法地址对应的就是0x88,当运行的时候,程序知道了我此时要调用的是Cat的eat方法,于是就将Cat重写的eat方法的地址拿出来并将 A这个地方中父类方法对应的地址改为Cat方法的地址,然后得以运行。

向上转型和向下转型

向上转型

向上转型:实际就是创建一个子类对象,将其当成父类对象来使用。

比如:

Animal animal=new Cat();

animal是父类类型,但可以引用一个子类对象,因为是从小范围向大范围的转换。

向上转型的优点:让代码实现更简单灵活,当我们在做一些项目的时候,在方法传参等方面会有巨大的便利。

向上转型的缺陷:不能调用到子类特有的方法。 

这个不能调用不是代表子类对象中没有,而是由于存储在栈区中的是父类的引用类型,这个引用类型只能指向自己类中拥有的成员,对子类中独有的成员无法进行指向。

向下转型

将一个子类对象经过向上转型之后当成父类方法使用,再无法调用子类的方法,但有时候可能需要调用子类特有的 方法,此时:将父类引用再还原为子类对象即可,即向下转换。

对于向下转型,由于是大的转小的,所以会非常的不安全,举个栗子:

如果animal对象此时不是向下转型的父类就会报错,为了避免这一问题,Java的研发团队引入了instanceof关键字,他可以帮我们判断类和对象之间的关系,帮助我们减少错误。 

多态的优点和注意事项

1. 能够降低代码的 "圈复杂度", 避免使用大量的 if - else

什么叫 "圈复杂度" ? 圈复杂度是一种描述一段代码复杂程度的方式. 一段代码如果平铺直叙, 那么就比较简单容易理解. 而如 果有很多的条件分支或者循环语句, 就认为理解起来更复杂. 因此我们可以简单粗暴的计算一段代码中条件语句和循环语句出现的个数, 这个个数就称为 "圈复杂度". 如果一个方法的圈复杂度太高, 就需要考虑重构. 不同公司对于代码的圈复杂度的规范不一样. 一般不会超过 10 .

2. 可扩展能力更强 如果要新增一种新的形状, 使用多态的方式代码改动成本也比较低.

class B {public B() {// do nothingfunc();}public void func() {System.out.println("B.func()");}
}
class D extends B {private int num = 1;@Overridepublic void func() {System.out.println("D.func() " + num);}
}
public class Test {public static void main(String[] args) {D d = new D();}
}

 比如这段代码,他的执行结果为D.func() 0。

这段代码可以作为之前知识的检测,他的执行顺序为:实例父类的成员变量——》执行父类的构造方法——》父类的构造方法中有func方法,于是调用func方法——》子类D中重写了func方法所以此时发生动态绑定即调用子类的func方法——》父类B成员尚未完成实例化,所以此时的D类中成员并没有实例化——》此时的num取默认值即0——》输出D.func() 0。

结论: "用尽量简单的方式使对象进入可工作状态", 尽量不要在构造器中调用方法(如果这个方法被子类重写, 就会触 发动态绑定, 但是此时子类对象还没构造完成), 可能会出现一些隐藏的但是又极难发现的问题.

以上就是本篇博客的全部内容,如有疏漏还请指正!如有帮助,还请三连! 

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

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

相关文章

【程序人生】4年创作纪念日,不忘初心,继续前行

📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

CleanMyMac X2022苹果电脑专业清理Mac加速器软件

CleanMyMac X2023最新免费版苹果电脑专业清理软件,对于Mac电脑用户来说,Cleanmymac X是一款再熟悉不过的电脑清理软件,它是由苹果认证并对外承认的一款第三方清理软件,几乎有95%的Mac用户都会安装并使用,Cleanmymac X究…

从一泡尿的工夫说起

大家好,我是校长。今天聊点不一样的,昨天读书的一点深刻感悟。大家有没有想过这么一个问题:如果没有记录时间的工具被发明,没有时钟,我们现在的生活会怎么样?在那个时钟尚未出现的日子里,如果确…

人工智能-机器学习-深度学习-概述

文章目录一:人工智能需要的基础和涉及内容二:数学基础(1)线性代数(2)概率论(3)数理统计(4)最优化方法(5)信息论三:机器学习…

虹科活动 | SWCF 2022卫星通信与仿真测试线上研讨会倒计时,快来报名吧!

您是否在因线下论坛的地点限制而错失技术干货分享?您是否因时间安排而无法亲临现场与行业专家交流?虹科举办全新线上论坛SWCF,与行业专家一起为您带来最新热点话题讨论与技术干货分享! 什么是SWCF 虹科每年将开展卫星与无线通信…

计算机毕业设计之java+ssm网络硬硬盘系统网站

项目介绍 网盘,又称网络U盘、网络硬盘,是一些网络公司推出的在线存储服务。向用户提供文件的存储、访问、备份、共享等文件管理功能,使用起来十分方便。不花钱的移动硬盘。用户可以把网盘看成一个放在网络上的硬盘或U盘,不管你是…

量子计算(十):量子计算原理

文章目录 量子计算原理 一、酉变换 二、矩阵的指数函数 三、单位矩阵 四、单量子比特逻辑门 五、泡利矩阵 六、常见逻辑门 量子计算原理 经典计算中,最基本的单元是比特,而最基本的控制模式是逻辑门,可以通过逻辑门的组合来达到控制电…

如何做好风险管控,杜绝项目风险突然爆发?

软件开发最怕临近交付期,项目风险突然爆发。那么如何做好风险管理,提前排除隐患? 1、提前规划开发风险的科学管理与控制流程 项目需建立自己的组织级别风险资产库,并在开发过程中,不断地更新和完善。并对项目风险进行科…

Java搭建宝塔部署实战毕设项目springboot车险理赔管理系统源码

大家好啊,我是测评君,欢迎来到web测评。 本期给大家带来一套Java开发的毕业设计项目springboot车险理赔管理系统源码。 技术架构 技术框架:SpringBoot mybatis bootstrap jquery mysql5.7运行环境:jdk8 nginx1.20 tomcat9 …

Spring IoC依赖注入-6

1. 依赖注入的模式和模型: Spring 提供了哪些依赖注入的模式和类型? 手动模式 - 配置或者编程的方式,提前安排注入规则 XML资源配置元信息Java 注解配置元信息API 配置元信息 自动模式 - 实现方提供依赖自动关联的方式,按照内建的注入规则 Autowiring …

VisDrone数据集之集群检测(一)

VisDrone坐标信息 VisDrone数据集格式: txt标签内容为:bbox_left,bbox_top,bbox_width,bbox_height,score,object_category,truncation,occlusion 类别: ignored regions(0), pede…

[附源码]计算机毕业设计springboot绿色生鲜

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

aws eks 日志和监控配置

资料 Kubernetes Logging powered by AWS for Fluent Bithttps://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/Container-Insights-setup-logs-FluentBit.html如何在 Amazon EKS 中将容器日志流式传输到 CloudWatch?, eks日志 使用fluentbit发送日志到…

PX4代码解析(6)

一、前言 上一节介绍了PX4姿态估计调用函数的流程,这一节分享一下我对PX4姿态解算的解读.首先,要理解PX4姿态解算的程序,要先从传感器的特性入手,这里主要介绍的传感器有加速度计,磁力计,陀螺仪. 二、传感…

2022最新1w字MySQL索引面试题(附md文档)

小熊学Java个人网站:https://javaxiaobear.gitee.io/,每周持续更新干货,建议收藏! 1、Mysql如何实现的索引机制? MySQL中索引分三类:B树索引、Hash索引、全文索引 2、InnoDB索引与MyISAM索引实现的区别是什…

11月30日:linux服务器安装以及部署项目

准备一个连接linux服务器的可视化工具,开始发车 推荐使用国产: finalshell 下载地址:FinalShell SSH工具,服务器管理,远程桌面加速软件,支持Windows,macOS,Linux,版本3.9.7,更新时间2022.10.26 - SSH工具 SSH客户端 xshell:安装…

ZooKeeper 避坑实践:如何调优 jute.maxbuffer

作者:子葵 背景 在日常运维 ZooKeeper 中,经常会遇到长时间无法选主,恢复时进程启动又退出,进而导致内存暴涨,CPU飙升,GC频繁,影响业务可用性,这些问题有可能和 jute.maxbuffer 的…

如何对研发团队绩效进行考核?【附各环节人员考核参考表】

研发团队是一个极富创造力的组织,对研发团队考核也非常不容易,PMO经常进行项目团队成员的考核,尤其是研发团队考核更是难题,绩效考核不是重在考核,而是在绩效目标设定时,除遵循SMART原则外,建议…

matlab学习笔记(七)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 matlab学习笔记(七)一、 LTI系统的响应impulse( ) 函数step( )函数lsim( )函数系统无初态时系统有初始状态时二、使用步骤A1:A2&#xff1…

30组易混易错词汇辨析,柯桥成人英语培训哪家好

30组易混易错词汇辨析 1. clothes, cloth, clothing clothes统指各种衣服,谓语动词永远是复数, cloth指布,为不可数名词 clothing 服装的总称,指一件衣服用a piece of, an article of 2. amount, number amount后接不可数名词…