java向上转型思考

2023-11-17

https://www.cnblogs.com/bangaj/p/5813738.html
下面是对向上转型思考

作用:简化开发,体现类的多态性  保证代码简洁

实现前提

            因为java是动态绑定特点,在编译时会编译器会自动找寻到 是子类方法还是父类的(我想主要是依据实例类型,而不是父类引用)

 使用场景

            1:在面向对象编程中,对一类业务逻辑进行抽象时,创建时是不知道具体入参类型的,但是类型或者对象又基本是相似的,这时候就需要抽象出来基类作为入参实现高内聚;

            2:在使用中,每个扩展类实现不同业务,这时提现了多态;

            3:尽管该方法需要父类,而你传进来的是其子类,剩下的编译器会做后续操作从而准确知道该调用基类还是扩展类的方法;

             编译器在这里做的操作:f.is(A a)

                        1):找到 f 以及它父类所有is方法;

                        2 ):找到is方法入参和A最相似的

                        3):将a向上转型,查看f中有没有is方法,没有就去父类找


在《think of java》中对'向上转型'有着如下的描述

看完之后很蒙圈,所以自己在网上找了一些描述,并自己做了简单的总结

 

简单的例子

class A{ 
public void A1(){
  System.out.println("父类方法1");
}
public void A2() {
  System.out.println("父类方法2");
}
}

class B extends A{
public void A1() {
  System.out.println("子类方法1");
}
public void B2() {
  System.out.println("子类方法2");
}
}

public class C{
public static void main(String args[]){
  A a=new B(); //upcast

  a.A1;

  a.A2;
}
}

输出:System.out.println("子类方法1"); 

   System.out.println("父类方法2"); 

说明:

A a=new B();
向上转型,通俗点就是说先创建一个B子类对象,然后把它强制转型为A类对象。所以A类A1()方法被子类B中的A1()方法覆盖,而子类中的B2()丢失。

 

来自CSDN。通俗易懂。
我们在现实中常常这样说:这个人会唱歌。在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念“人”。再例如,麻雀是鸟类的一种(鸟类的子类),而鸟类则是动物中的一种(动物的子类)。我们现实中也经常这样说:麻雀是鸟。这两种说法实际上就是所谓的向上转型,通俗地说就是子类转型成父类。这也符合Java提倡的面向抽象编程思想。来看下面的代码:
package a.b;
public class A {
public void a1() {
System.out.println("Superclass");
}
}
A的子类B:
package a.b;
public class B extends A {
public void a1() {
System.out.println("Childrenclass"); //覆盖父类方法
}
public void b1(){} //B类定义了自己的新方法
}
C类:
package a.b;
public class C {
public static void main(String[] args) {
A a = new B(); //向上转型
a.a1();
}
}
如果运行C,输出的是Superclass 还是Childrenclass?不是你原来预期的Superclass,而是Childrenclass。这是因为a实际上指向的是一个子类对象。当然,你不用担心,Java虚拟机会自动准确地识别出究竟该调用哪个具体的方法。不过,由于向上转型,a对象会遗失和父类不同的方法,例如b1()。有人可能会提出疑问:这不是多此一举吗?我们完全可以这样写:
B a = new B();
a.a1();
确实如此!但这样就丧失了面向抽象的编程特色,降低了可扩展性。其实,不仅仅如此,向上转型还可以减轻编程工作量。来看下面的显示器类Monitor:
package a.b;
public class Monitor{
public void displayText() {}
public void displayGraphics() {}
}
液晶显示器类LCDMonitor是Monitor的子类:
package a.b;
public class LCDMonitor extends Monitor {
public void displayText() {
System.out.println("LCD display text");
}
public void displayGraphics() {
System.out.println("LCD display graphics");
}
}
阴极射线管显示器类CRTMonitor自然也是Monitor的子类:
package a.b;
public class CRTMonitor extends Monitor {
public void displayText() {
System.out.println("CRT display text");
}
public void displayGraphics() {
System.out.println("CRT display graphics");
}
}
等离子显示器PlasmaMonitor也是Monitor的子类:
package a.b;
public class PlasmaMonitor extends Monitor {
public void displayText() {
System.out.println("Plasma display text");
}
public void displayGraphics() {
System.out.println("Plasma display graphics");
}
}
现在有一个MyMonitor类。假设没有向上转型,MyMonitor类代码如下:
package a.b;
public class MyMonitor {
public static void main(String[] args) {
run(new LCDMonitor());
run(new CRTMonitor());
run(new PlasmaMonitor());
}
public static void run(LCDMonitor monitor) {
monitor.displayText();
monitor.displayGraphics();
}
public static void run(CRTMonitor monitor) {
monitor.displayText();
monitor.displayGraphics();
}
public static void run(PlasmaMonitor monitor) {
monitor.displayText();
monitor.displayGraphics();
}
}
可能你已经意识到上述代码有很多重复代码,而且也不易维护。有了向上转型,代码可以更为简洁:
package a.b;
public class MyMonitor {
public static void main(String[] args) {
run(new LCDMonitor()); //向上转型
run(new CRTMonitor()); //向上转型
run(new PlasmaMonitor()); //向上转型
}
public static void run(Monitor monitor) { //父类实例作为参数
monitor.displayText();
monitor.displayGraphics();
}
}
我们也可以采用接口的方式,例如:
package a.b;
public interface Monitor {
abstract void displayText();
abstract void displayGraphics();
}
将液晶显示器类LCDMonitor稍作修改:
package a.b;
public class LCDMonitor implements Monitor {
public void displayText() {
System.out.println("LCD display text");
}
public void displayGraphics() {
System.out.println("LCD display graphics");
}
}
CRTMonitor、PlasmaMonitor类的修改方法与LCDMonitor类似,而MyMonitor可以不不作任何修改。
可以看出,向上转型体现了类的多态性,增强了程序的简洁性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java向上转型思考 的相关文章

  • Hadoop完全分布式集群——Hadoop 配置

    前面已完成VMware虚拟机安装与配置 参考前一篇Hadoop完全分布式集群 VMware虚拟机安装与配置 夏雨和阳阳的博客 CSDN博客 下面将进行Hadoop 配置 一 slave1 slave2节点配置修改 slave1 slave2
  • 推荐 OS X 下最方便实用的六款解压缩软件

    对于我们这种资料特别多 随时都需要跟工作伙伴沟通传递资料的人来说 一款方便的压缩软件真的太重要了 不仅可以节省时间 节省内存 更重要的是提高工作效率 今天废鱼就给大家推荐几款常用压缩软件 The Unarchiver The Unarchi
  • 【华为OD统一考试B卷

    在线OJ 本题通过率100 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1
  • 2021全国大学生电子设计竞赛F题(智能送药小车)国一赛后总结

    作为2022年的第一篇博客 思索了很久 就以此为题吧 11月7号随着电赛比赛的结束 我的大学竞赛生涯也差不多告一段落了 那天的心情也是无法用语言形容 第二天就又回归了正常的上课生活 2021年的电赛 既让人期盼 又存在许多变数 这一切都要从
  • java日期格式化yyyy-mm-dd

    在 Java 中 你可以使用 SimpleDateFormat 类来格式化日期 以 yyyy MM dd 为例 你可以这样写 SimpleDateFormat dateFormat new SimpleDateFormat yyyy MM
  • 回调函数 —— 借助中间通用函数(形参里有函数指针,实现函数注册)调用不同的回调函数 (多态/分层)

    回调函数传参 函数指针做函数参数 回调函数 目录 背景 回调函数是实现函数分层且单向依赖的好办法 使用函数指针运行 struct结构体回调函数代码更清晰 简单理解回调函数 Demo 其他回调函数博文 背景 这是我在实际工作中遇到的问题 线程
  • VSCode中简单使用Git

    在一个目录下clone项目 git clone 项目 git 使用VScode 打开项目 使用vscode修改代码并提交代码 修改代码 点击 相当于git add 点击对号 等于git commit m 备注信息 右边的箭头输入需要备注的信
  • Angular6学习笔记5:修改组件的属性并实时显示(ngModel)

    修改组件的属性并实时显示 ngModel 继学习笔记4以后 可以在一个AppComponent中显示了heroesComponent的属性信息 但是hero的Name往往是可以更改的 并将更改后的数据进行实时显示 1 将hero的Name重
  • umi4js集成Material UI

    umi4js集成Material UI 效果图 创建umi项目 创建umi项目 umi 目录结构 启用插件 dva 页面中使用dva 使用useDispatch useSelector 编辑layout createTheme 根据rout
  • 利用GEE计算遥感生态指数(RSEI)

    城市生态与人类生活息息相关 快速 准确 客 观地了解城市生态状况已成为生态领域的一个研究重点 基于遥感技术 提出一个完全基于遥感技术 以自然因子为主的遥感生态指数 RSEI 来对城市的生态状况进行快速监测与评价 该指数利用主成分分析技术集成
  • 这里推荐几个前端动画效果网站

    1 AnimistaAnimista 是一个 CSS 动画 转场库和在线工具 它有许多现成的 CSS 动画片段可以直接使用 也可以在线定制动画 网站地址 Animista On Demand CSS Animations Library 2
  • jmeter获取cookie值,设置集合点,参数化

    1 使用csv数据文件 进行登录会员的参数化 2 设置登录接口 3 在登录接口中设置集合点 4 在bin目录下 打开jmeter properties文件 CookieManager save cookies false改为true 并把
  • idea类图使用、时序图

    1 查看是否支持类图 idea默认已经集成了该功能 1 1 配置类图生成内容 搜索Diagrams 可以配置类图生成时的现实内容 2 自动生成类图 选择package或类 2 1 选择类 2 1 1 显示子类 ctrl alt b 可显示子
  • 关于nginx无论怎么配置都还是跳转到欢迎界面的解决方案

    hello 各位猿友们 是不是在第一使用nginx时 会遇到无论你怎么修改nginx conf文件都还是跳转到欢迎界面的问题 然后把度娘翻了个遍都然并卵 你说绝不绝望 生不生气 莫要慌 救世主来了 产生该问题的原因 兄die 你改错地方了
  • Shell排序(java版)

    博主介绍 程序员悟啦 乌拉 个人仓库 码云 座右铭 懒 对一个人的毁灭性有多大 早起的重要性就多大 免责声明 文章由博主原创 部分文章整理于网络 仅供学习和知识分享 相遇是缘 既然来了就拎着小板凳 坐下来一起唠会儿 如果在文中有所收获 请别
  • ROS 报错 ModuleNotFoundError: No module named ‘rospkg‘

    文章目录 写在前面 一 问题描述 二 出现原因 1 Anaconda base 环境下的出现原因 2 Anaconda 虚拟环境下的出现原因 三 解决方法 1 Anaconda base 环境下解决方法 2 Anaconda 虚拟环境下解决
  • 对象与Json字符串互转工具类

    import com fasterxml jackson core JsonProcessingException import com fasterxml jackson databind JavaType import com fast
  • 数据库设计DDL

    DDL 数据定义语言 用来定义数据库对象 数据库 表 DDL 数据库操作 查询 查询所有数据库 show databases 查询当前数据库 select database 使用 使用数据库 use 数据库名 创建 创建数据库 create
  • kali linux网络相关nmcli:ip、网关、路由、DNS的查看修改

    一 查看信息 设备device nmcli device show eht0 查看网卡设备的信息 ip 网关 路由 DNS 指定网卡eth0 nmcli device status 查看网卡设备的状态 nmcli device discon

随机推荐

  • Linux基础学习01——部署虚拟环境安装Linux 系统(VMware WorkStation Pro 16+ RHEL8 )

    VmwareWorkStation 16 虚拟机软件 必需 这是一款功能强大的桌面虚拟计算机软件 能够让用户在单一主机同时运行多个不同的操作系统 同时支持实时快照 虚拟网络 拖曳文件以及PXE等强悍功能 点此百度网盘下载密码 hh6t Re
  • swagger注释API详细说明

    API详细说明 注释汇总 作用范围 API 使用位置 对象属性 ApiModelProperty 用在出入参数对象的字段上 协议集描述 Api 用于controller类上 协议描述 ApiOperation 用在controller的方法
  • Apache服务安全加固及Apache优化

    转载来源 https help aliyun com knowledge detail 52981 html 一 账号设置 以专门的用户帐号和用户组运行 Apache 服务 1 根据需要 为 Apache 服务创建用户及用户组 如果没有设置
  • python+selenium自动化测试通过cookie绕过登录验证

    前言 之前记录过通过截图获取验证码的方式实现登录 但目前存在识别不准确的情况 因此有本篇通过cookie绕过登录验证的方法 绕过登录后 可以便于对系统的功能界面进行自动化测试设计 一 关于cookie的一些认知 1 浏览器的缓存有两种机制
  • C++ 中sort排序改变数值相同的数据相对位置的解决办法

    今天给大家介绍个超级好用的知识 写了那么多的排序 但是其实C 里封装有排序函数 而且功能非常强大 sort函数有sort stable sort 和partial sort sort 函数是对给定区间的元素进行排序 但是会改变值相同的元素的
  • Centos7搭建RabbitMQ集群及单机多节点部署

    安装基本环境 yum y install wget vim bash completion lrzsz nmap telnet tree net tools bind utils lsof ntpdate iotop erlang环境 wg
  • 深入理解计算机系统-笔记

    计算机系统漫游 程序 程序的生命周期从一个源程序 源文件 开始 即程序员利用编辑器创建并保存的文本文件 如文件名为hello c的c语言程序 源程序是由0和1组成的位序列 8个位被组织成一组 称为字节 每个字节表示程序中的某个文本字符 这种
  • css布局 - 垂直居中布局的一百种实现方式(更新中...)

    首先将垂直居中的现象和实现方式两大方向细分类如下 接下来逐条累加不同情况下的垂直居中实现 目录 一 父元素高度固定时 单行文本 图片的垂直居中 1 line height行高简单粗暴实现法 line height Npx N 与元素高度相同
  • parted 分区与磁盘扩容(二)

    前 LVM分区管理是对后续扩容磁盘做铺垫的 现在2TB的硬盘都非常常见了 对于超过2TB的硬盘分区 需要使用parted命令进行操作 fdisk只可以操作2TB之内的 本次教程教你们如何轻松实现2T以上和2T以下磁盘的分区及扩容 一 首先要
  • avalon框架中ms-visible和ms-if的区别

    在avalon的官方教程中说 ms visible的作用是使元素在一定条件下隐藏 不显示 ms if 同样隐藏 但它是将元素移出DOM 这个功能直接影响到CSS empty伪类的渲染结果 那么 什么是伪类 它与class id等功能类似 也
  • 利用VTK显示PLY网格模型文件

    define vtkRenderingCore AUTOINIT 2 vtkRenderingOpenGL2 vtkInteractionStyle include
  • 使用Idea打开Maven项目的正确姿势

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在学习网上大神们的源码过程中 经常有一些打包好的项目可以提供给自己参考学习 其中不乏一些maven项目 因为自己使用的开发环境是Idea Gradle 对于Maven虽有耳
  • 模型设计总结(1)

    用单变量线性时间序列预测模型预测股价走势有一定的局限性 因此 为了充分利用时间序列的特性数据序列 深入挖掘数据特征 提高数据质量为了提高股票价格预测的准确性 基于CNN LSTM的股票价格预测方法进行股票次日收盘价预测 卷积神经网络 CNN
  • Pandas 使用ExcelWriter实现覆盖文件操作

    if sheet exists replace 这段代码主要实现的作用是 多次使用同一个文件 创建sheet时 但已存在同样的sheet名 进行覆盖操作 writer pd ExcelWriter result file path engi
  • 【阅读随笔】Modularized Control Synthesis for Complex Signal Temporal Logic Specifications

    又是一篇有关STL任务分解的文章 1 Z Zhang and S Haesaert Modularized Control Synthesis for Complex Signal Temporal Logic Specifications
  • 防御第三天

    1 总结当堂NAT与双机热备原理 形成思维导图 2 完成课堂NAT与双机热备实验 fw1
  • PIO操作Excel,通过文件流判断Excel的版本

    import com fasterxml jackson databind exc InvalidFormatException import org apache poi ss usermodel Workbook import org
  • 送书

    又到了周三了 说实话 本来这期想鸽的 上海这边的疫情太严重了 前几期上海这边中奖的粉丝都没办法收货 只能等解封后再安排了 在这里和大家道个歉 希望大家谅解 最后希望在上海的小伙伴们早日渡过难关 像这种一把青菜50块的日子什么时候才是个头啊
  • 推荐七种开源免费的C/C++网络库

    1 ACE 庞大 复杂 适合大型项目 开源 免费 不依赖第三方库 支持跨平台 2 Asio Asio基于Boost开发的异步IO库 封装了Socket 简化基于socket程序的开发 开源 免费 支持跨平台 3 POCO POCO C Li
  • java向上转型思考

    https www cnblogs com bangaj p 5813738 html 下面是对向上转型思考 作用 简化开发 体现类的多态性 保证代码简洁 实现前提 因为java是动态绑定特点 在编译时会编译器会自动找寻到 是子类方法还是父