java多态+多态中隐含的问题

【0】RAEDME

0.1)本文总结于 core java volume 1, 感觉多态中存在的这个问题很新颖,故分享之;


【1】继承与is-a法则

1.1)有一个用来判断是否应该设计为继承关系的规则: 这就是 is-a 规则, 它表明子类的每个对象也是超类的对象;
1.2)is-a法则: is-a 法则 的另一种表述法是 置换法则, 它表明程序中出现超类对象的任何地方都可以用子类对象置换;
如, 可以将子类的对象赋给超类变量:

Employee e;
e = new Employee();
e = new Manager();

【2】多态

2.1)多态定义: 在java中, 对象变量是多态 的, 一个 Employee变量既可以引用一个 Employee 类对象,也可以引用一个 Employee 类的 任何子类对象;
2.2)从以下代码,就可以看出 置换法则的优点:

Manager boss = new Manager(......);
Employee[] staff = new Employee[3];
staff[0] = boss;
staff[1] = new Employee("tangtang", 1, 2, 3, 4);
staff[2] = new Employee("rongrong", 4, 3, 2, 1);

2.3)在上面的代码中, 变量 staff[0] 和 boss 引用同一个对象, 但编译器将 staff[0] 看做是 Employee对象;
2.4)这意味着, 可以这样调用 boss.setBonus(…) ;但是不可以这么调用: staff[0].setBonus(……); 这是因为 staff[0] 声明的类型是 Employee, 而setBonus 不是 Employee 类的方法;
2.5)也不能将一个超类的引用赋给子类变量,下面的赋值是非法的:
Manager m = staff[i]; 非法;原因很清楚, 不是所有的雇员都是经理;
Alert) 在java中, 子类数组的引用可以转换成超类数组的引用, 而不需要采用强制类型转换, 如,下面是一个经理数组:

Manager[] managers = new Manager[10];

将它转换为 Employee 数组是完全合法的:

Employee[] staff = managers; 

【3】java多态机制存在的问题(很隐秘, 这个问题)

3.1)这样做后,存在的问题(切记 managers 和 staff 引用的是同一个数组):
如, staff[0] = new Employee(“XiaoTang”, ……);
编译器竟然接纳了这个赋值操作。但这里, staff[0] 和 managers[0] 引用的是同一个对象, 似乎我们把一个普通员工归入经理的行列了, 这是一种很忌讳发生的事情;当调用 managers[0].setBonus(10000)的时候, 将会导致调用一个不存在的实例域, 进而搅乱相邻存储空间的内容;
3.2)为了确保不发生这类错误, 所有数组都要牢记创建它们的元素类型,并负责监督仅将类型兼容的引用存储到数组中;
这里写图片描述

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

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

相关文章

MacOS命令终端(CMD)的快捷键/终端快捷键

文章目录常用删除清屏复制粘贴交互/撤销移动光标查找历史命令使用命令查看历史命令标签页控制命令滚屏常用 快捷键说明Control A跳到本行的行首Control E跳到本行的行尾Control U删除光标前面(左侧)的所有文字(还有剪切功能)&…

apache kafka_使用Apache Kafka,Kubernetes和Envoy,Istio,Linkerd的服务网格和云原生微服务...

apache kafka微服务架构不是免费的午餐 ! 微服务需要解耦,灵活,操作透明,数据感知和弹性。 过去几年的大多数材料仅讨论具有紧密耦合且不可扩展的技术(如REST / HTTP)的点对点体系结构。 这篇博客文章介绍了…

c++ 箭头符号怎么打_老司机怎么测量三极管管型、管脚和性能?三极管测量此中有深意...

众所周知,三极管具有基极、集电极、发射极三极,另外还有NPN型还有PNP型,那么如何用最快的方法进行三极管测量来确认三极管的管脚和管型。另外,三极管的工作状态是否可以通过三极管测量进行判断?接下来本网整理了老司机…

java强制类型转换

【0】README 0.1)本文转自 core java volume 1 ,在强制类型转换部分,它提到了 使用 instanceof 以保证 类型成功转换(而不是抛出异常),很有看点; 【1】强制类型转换的相关知识点: …

MacBook快捷键

文章目录一、选择文本二、移动光标三、打开特定的目录四、录屏/截屏五、选择输入法六、视窗七、窗口缩放八、检索/搜索九、目录路径十、页面滚动十一、删除/清空回收站十二、显示隐藏文件十三、程序坞十四、关机十五、清理缓存十六、窗口最小化十七、分屏十八、Finder/访达窗口…

php cdi_通过MicroProfile上下文传播增强了CDI上下文和隔板

php cdi当将CDI与异步执行方法(例如ManagedExecutorService ,传统上不可能访问在原始线程中处于活动状态的所有CDI范围。 MicroProfile Context Propagation可以定义线程执行上下文并将其传递到完成阶段,尽管我们的代码是异步执行的&#xff…

Final Cut Pro X 快捷键

文章目录一、片段编辑二、导出/导入媒体三、选取/选择片段四、修剪(一)修剪模式的三种修剪效果五、其它编辑快捷键六、光标功能状态切换七、移动播放头八、播放九、插入媒体素材到时间线十、更改片段在时间线的外观十一、为片段添加/删除效果十二、为片段…

求三个数的最大最小值

【0】README 0.1) google 搜索出来的答案,真的很让我伤心, 全是大粪啊, 你们进行了多少次的比较, 应该是6次吧,我也是醉完了, 写个非大粪的version (我这里的比较只有两次&#xff…

斐讯k1潘多拉专版固件_斐讯K1刷专版潘多拉固件以及教程(使用感受)

本帖最后由 Super131 于 2016-3-5 10:09 编辑QQ图片20160225010211.png (24.22 KB, 下载次数: 2)2016-2-25 01:02 上传K1的专版潘多固件最有看点一个地方我觉得是外观,比起之前显得让人看着舒服多了QQ图片20160225010400.png (41.37 KB, 下载次数: 0)2016-2-25 01:0…

魔术方法 类 序列化_Java序列化魔术方法及其示例使用

魔术方法 类 序列化在上一篇文章中, 您需要了解有关Java序列化的所有知识 ,我们讨论了如何通过实现Java序列化来启用类的可序列化性。 Serializable接口。 如果我们的类未实现Serializable接口,或者该类具有对非Serializable类的引用&#x…

算法证明_CFR+算法证明过程

在介绍CFR算法之前,我们首先介绍一下基础概念。在CFR算法中,counterfactual utility被定义为以下形式:然后在regret的基础上,CFR算法定义了一个regretlike value,注意在这里CFR算法的regret为一个累加值,而…

java继承中的 equals + hashCode+toString

【0】README 0.1)本文转自 core java volume 1, 旨在理清 equals hashCode方法; 0.2) 特别说明: 在java中, 只有基本类型不是对象, 例如,数值, 字符和布尔类型的值都不…

纹理和基元_自定义基元和DTO的(反)序列化和验证

纹理和基元最近,我们为您提供了新的HTTP框架HttpMate。 在介绍性文章中 ,我们将请求和响应映射到域对象称为“最复杂的技术细节”,以及如何通过另一个伴侣MapMate帮助我们。 实际上,当将请求属性映射到您的域对象时,M…

vim 常用命令

文章目录普通命令模式下技巧汇总切换到插入模式切换到可视模式切换至底行命令模式复制内容复制命令的记忆技巧粘贴/恢复修改/改写删除/剪切字符大小写切换选择文本游标移动剪切文本/移动文本滚屏/翻页撤回查看文档状态查找/搜索字符串查看历史命令查看历史搜索记录多窗口操作保…

常见花材的固定的方法有哪些_旋流器常见的故障及处理方法有哪些?

旋流器除了用在磨矿循环中的分级作业外,还可以用于脱泥、脱水以及脱除浮选药剂等。此外,还可以用做重悬浮液选矿,其分选粒度可达0.1毫米左右。旋流器有许多优点,构造简单,没有运动部件,单位容积的处理能力大…

二叉堆(优先队列)

【0】README 0.1) 本文总结于 数据结构与算法分析,但源代码均为原创;旨在理清二叉堆(优先队列) 堆的其他操作及其应用, 以便让朋友些知道为什么要学习优先队列; 【1】二叉堆 1.0)…

java自定义外部接口_如何使用可外部化的接口在Java中自定义序列化

java自定义外部接口在上一篇文章“用示例介绍的有关Java序列化的一切”中 ,我解释了如何使用以下方法序列化/反序列化一个对象 Serializable接口,还说明了如何使用writeObject和readObject方法自定义序列化过程。 Java序列化过程的缺点 但是这些自定义…

python训练营朋友圈留言_用Python发一个高逼格的朋友圈【附代码】

今天二胖要给大家介绍一个Python库:PIL(Python Image Library)下面我们用一个实际的例子看看50行python代码可以做什么神奇的事情这是二胖发的一个朋友圈切图前是一张图切图后就是九张图啦成功霸屏除了可以处理规整的正方形图片还可以处理非规则的图片比如下面这张宽…

vim 编辑器的快捷键

文章目录命令终端界面滚屏命令终端页签切换缓存区切换/文件切换分割窗口/打开新窗口切换窗口移动/旋转/移出窗口关闭窗口调整窗口大小底行命令模式下的编辑快捷键vim 很多指令或者快捷键是大小写敏感。命令终端界面滚屏 快捷键说明Fn ←向上滚屏到开始处Fn →向下滚屏到末尾…