Think in Java之多态

多态通过分离做什么和怎么做,从另一角度将接口和实现分离开来。多态方法调用允许亿欧汇总类型表现出与其他相似类型之间的区别。

向上转型

导出类从基类继承而来,所以存在于基类中的接口也必定存在于导出类中。将导出类转换为基类称作“向上转型”,上是按照类的继承关系为方向的。

增加扩展性

当我们想调用基类的某个方法时,不同的导出类都会有不同的行为,只需覆盖该方法即可。当有新的导出类时我们不必定义新方法去做事情直接覆盖基类的方法版本编译器自动帮我们定位到时机调用的导出类的方法。

我们只在基类中写一个简单方法, 它只接受基类类型为参数,而不是特殊的导出类,也就是说在调用方法的时候不考虑导出类的存在,编写的代码只是和基类打交道,具体的行为编译器帮我们自动判断该调用哪个方法版本。

方法绑定

编译器如何得知这个基类类型是哪个导出类类型呢?比如DShape有三个导出类:Circle,Rect,Triangle;并且这三个导出类都复写了父类的方法,编译器如何得知真实的类型是这三个中的哪个呢?

编译器也无法得知。

将一个方法调用同一个方法主体关联起来被称作绑定。在程序执行前进行的绑定叫做前期绑定(由编译器和连接程序实现),该绑定方式是面向过程语言无默认的绑定方式,C语言只有一种绑定方式就是前期绑定;多态其实就是因为前期绑定的问题而不知道该调用哪个方法版本,还有一种绑定叫做后期绑定:在运行时根据对象的类型进行绑定,这种绑定方式的实现是通过在对象中增加“某些类型信息”来实现的。

Java中除了stratic方法和final方法(private方法也属于final方法)外,其他方法都属于后期绑定。final方法可以有效的关闭“动态绑定”,告诉编译器不需要动态绑定因为其不会被复写也就不需要运行时绑定。

多态的坑

与其说是多态的坑不如说是不了解多态

private方法

当我们在基类中定义一个draw方法修饰符为private。在导出类中再定义一个同名的公开的draw方法。使用多态调用draw方法时会发现调用的是基类的方法。

原因

由于private方法会被编译器认为是final方法,采用的是前期绑定的方式对导出类是屏蔽的;子类的draw方法是一个全新的方法,既然基类中的draw方法对子类不可见,也就不能发生重载覆盖,在加上其声明类型为基类,所以调用的是基类的版本

结论

只有非private的方法才会被覆盖。在导出类中,对于基类的private方法采用不同的方法名字。

static方法

和上面类似,导出类和基类定义同名的静态方法,使用多态时调用的方法版本是基类的static方法。

原因

静态方法是与类绑定的而不时和单个对象绑定的。

结论

static方法不具有多态性

非final方法

private方法也即final方法。要保证在构造器中调用的方法是final的,比如在基类构造器中调用的方法是可被覆盖的那么就会出现问题,很可能可被覆盖的方法此时需要的变量还未初始化(对象构造顺序)因此出现奇怪现象。

所以要保证构造器中调用的方法是不可被覆盖的,也就是final的

Field的访问

向上转型过程中,域访问操作都由编译器自动解析,因此也属于前期绑定。

使用多态访问同名属性时访问的是基类的属性(动态绑定只针对与方法调用);在方法中访问属性时会用到动态绑定,默认的域是实际类型,如果想访问基类的属性需要在方法中使用super.属性

转载于:Think in Java之多态 - 掘金 (juejin.cn)

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

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

相关文章

JSON.parse解析报错Bad control character in string literal in JSON

当使用JSON.parse解析json时报错Bad control character in string literal in JSON,JSON.parse()方法将有效的 JSON 字符串数据转换为 JavaScript 对象,内部不能包含转义字符。 解决办法: 方法一.前端解析前处理掉\r,\n,\t 等转义字符 let text = {"fail_station&q…

数据结构与算法编程题50

假设不带权有向图采用邻接矩阵G存储,设计实现以下功能的算法。 (1)求出图中每个顶点的出度。 (2)求出图中出度为0的顶点数。 (3)求出图中每个顶点的入度。 //参考博客:https://blog.…

基于协同过滤算法的旅游推荐系统设计与实现

点我完整下载 基于协同过滤算法的旅游推荐系统设计与实现 Design and Implementation of a Travel Recommendation System based on Collaborative Filtering Algorithm 目录 目录 2 摘要 3 关键词 4 第一章 绪论 4 1.1 研究背景 4 1.2 研究目的和意义 5 1.3 主要研究内容 6 1.…

想要精通GO语言?这些网站是你的最佳选择!

介绍:Go(又称 Golang)是由 Google 的 Robert Griesemer,Rob PGo(又称 Golang)是由 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。它在2009年11月10…

matplotlib与opencv图像读取与显示的问题

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 最近在用opencv和matplotlib展示图片,但是遇到了一些问题,这里展开说说 首先需要明确的是,opencv和matplotlib读取图片都是通道在最后,而前者默认可见光图像是BGR,后者是RGB.此外还有PIL以及imageio等读取图像的工具…

如何使用cpolar+Plex在Windows系统上搭建私人媒体影音站点公网可访问

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特别是各…

Spring中MultipartFile和File转换

前言:在SpringBoot项目中经常用到的就是MultipartFile和File转换的问题,一开始我也并不是非常了解,参考了一些资料和ChatGPT的帮助后完成的业务开发,现在有时间就自己总结一下并记录一下简单的用法,可能不是很全 正文&…

ERP软件定制开发对企业的优势|app小程序搭建

ERP软件定制开发对企业的优势|app小程序搭建 随着科技的不断发展,企业管理也面临了更多的挑战。为了更好地适应市场需求和提高运营效率,越来越多的企业开始选择使用ERP软件进行管理。然而,市场上现成的ERP软件并不能完全满足企业的需求&#…

兰州电力博物馆 | OLED透明展示台:创新展示,增强互动体验

产品:8片55寸OLED透明屏 应用场景:OLED透明屏利用其高透明度的特点,可以叠加在文物展示台上面,这种展示方式既让观众看到了文物原貌,又能了解其内部结构和细节特点,打破空间的束缚。 项目时间&#xff1a…

opencv知识库:cv2.add()函数和“+”号运算符

需求场景 现有一灰度图像,需求是为该图像增加亮度。 原始灰度图像 预期目标图像 解决方案 不建议的方案——“”运算符 假设我们需要为原始灰度图像的亮度整体提升88,那么利用“”运算符的源码如下: import cv2img_path r"D:\pych…

SCADA软件工具有多少免费的?

随着工业自动化的飞速发展,SCADA系统已经成为工业领域智能化转型绕不开的重要工具,不少个人和公司也都加入到了学习研究SCADA系统的队伍中。数维图小编耗费大量时间整理了国内外免费(非完全免费)的SCADA软件工具,有部分…

电源模块测试系统测试稳压电源 提升电源稳定性和可靠性

稳压电源是用来将不稳定的电压转换为稳定的输出电压的电子装置,其性能、稳定性和可靠性直接影响着工作状态。稳压电源测试是保证电子设备稳定工作的重要环节,那么如何测试稳压电源呢? 一、静态测试 静态测试是通过万用表或数字电压表测量稳压电源的输出…

ComplexHeatmap热图专栏 | 6. 3D热图绘制教程

本期教程 原文链接https://mp.weixin.qq.com/s/EyBs6jn78zOomcTv1aP52g 6 3D热图的绘制教程 基于《热图绘制教程》专栏,本教程已更新了5个章节,不知道大家是否有所收获。对于小杜个人来说,真的需要不断的复习和练习才可以记住,但…

RedHat9中安装Mysql8.0+出现“错误:GPG 检查失败“的处理

近期通过VM安装了RedHat9,之后在RedHat9中安装Mysql8.0的时候出现了个问题:“错误:GPG 检查失败”,如图所示: 解决方案:重新导入新的秘钥即可,如下所示: rpm --import https://rep…

Java面试整理(四)Java IO流

我记得自己刚开始学Java的时候,都听过师兄的分享,说IO流是很重要,而且很难。 自己正式接触之后,其实IO流这块知识并不是特别难,而且随着IT的发展,IO流这块反而用得不是很多。特别是在应用开发这个层面,用得更少。 当然,可能会有朋友跳出来说“这怎么可能?你不懂Java吧…

vr建筑虚拟实景展厅漫游体验更直观全面

随着科技的不断进步,纯三维、可交互、轻量化的三维线上展览云平台,打破时间界限,以其独特的魅力,给予客户更多的自主性、趣味性和真实性,客户哪怕在天南地北,通过网络、手机即可随时随地参观企业线上立体化…

软件测试中的分析与混沌理论

软件测试就像科学研究,需要在需求中找到一条通路。作为测试人员,我们揭示应用程序中固有的混乱,让代码更有序。 科学需要分析能力,软件测试也需要。分析思维对于个人及其组织的成长至关重要。分析性思考的人可以在问题发生之前就…

泳道图绘制全攻略,一图胜千言,快速上手

泳道图是一种流程图的形式,通过在不同的泳道中展示不同的参与者,帮助我们更好地理解和分析流程。它是一种非常有用的工具,可以帮助我们在团队协作、流程管理和问题解决等方面取得更好的效果。 1. 泳道图的定义 泳道图是一种以泳道为基础的流程…

浅析pyqt事件机制

pyqt事件机制 一、什么是pyqt事件机制? ​ 事件是指用户操作或系统发生的各种动作,比如鼠标点击、键盘输入、窗口大小变化等。事件可以由用户或操作系统触发,然后被传递给应用程序进行处理。PyQt的事件机制通过事件循环(Event L…

如何通过内网穿透实现无公网IP也能远程访问内网的宝塔面板

文章目录 一、使用官网一键安装命令安装宝塔二、简单配置宝塔,内网穿透三、使用固定公网地址访问宝塔 宝塔面板作为建站运维工具,适合新手,简单好用。当我们在家里/公司搭建了宝塔,没有公网IP,但是想要在外也可以访问内…