在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型。

向上转型

我们在现实中常常这样说:这个人会唱歌。在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念“人”。再例如,麻雀是鸟类的一种(鸟类的子类),而鸟类则是动物中的一种(动物的子类)。我们现实中也经常这样说:麻雀是鸟。这两种说法实际上就是所谓的向上转型,通俗地说就是子类转型成父类。这也符合Java提倡的面向抽象编程思想。来看下面的代码:

A的子类B:

C类:

如果运行C,输出的是Superclass 还是Childrenclass?不是你原来预期的Superclass,而是Childrenclass。这是因为a实际上指向的是一个子类对象。当然,你不用担心,Java虚拟机会自动准确地识别出究竟该调用哪个具体的方法。不过,由于向上转型,a对象会遗失和父类不同的方法,例如b1()。有人可能会提出疑问:这不是多此一举吗?我们完全可以这样写:

确实如此!但这样就丧失了面向抽象的编程特色,降低了可扩展性。其实,不仅仅如此,向上转型还可以减轻编程工作量。来看下面的显示器类Monitor:

液晶显示器类LCDMonitor是Monitor的子类:

阴极射线管显示器类CRTMonitor自然也是Monitor的子类:

等离子显示器PlasmaMonitor也是Monitor的子类:

现在有一个MyMonitor类。假设没有向上转型,MyMonitor类代码如下:

可能你已经意识到上述代码有很多重复代码,而且也不易维护。有了向上转型,代码可以更为简洁:

我们也可以采用接口的方式,例如:

将液晶显示器类LCDMonitor稍作修改:

CRTMonitor、PlasmaMonitor类的修改方法与LCDMonitor类似,而MyMonitor可以不不作任何修改。

可以看出,向上转型体现了类的多态性,增强了程序的简洁性。

向下转型

子类转型成父类是向上转型,反过来说,父类转型成子类就是向下转型。但是,向下转型可能会带来一些问题:我们可以说麻雀是鸟,但不能说鸟就是麻雀。来看下面的例子:

A类:

A的子类B:

C类:

从上面的代码我们可以得出这样一个结论:向下转型需要使用强制转换。运行C程序,控制台将输出:

其实黑体部分的向下转型代码后的注释已经提示你将发生运行时错误。为什么前一句向下转型代码可以,而后一句代码却出错?这是因为a1指向一个子类B的对象,所以子类B的实例对象b1当然也可以指向a1。而a2是一个父类对象,子类对象b2不能指向父类对象a2。那么如何避免在执行向下转型时发生运行时ClassCastException异常?使用5.7.7节学过的instanceof就可以了。我们修改一下C类的代码:

这样处理后,就不用担心类型转换时发生ClassCastException异常了。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

原文链接:http://blog.csdn.net/qq_35101189/article/details/57417933

java 强制向上转型,Java 转型(向上或向下转型)详解及简单实例相关推荐

  1. java对文件的操作详解_Java 对 Properties 文件的操作详解及简单实例

    Java 对 Properties 文件的操作详解及简单实例 发布于 2020-8-7| 复制链接 摘记: Java 对 Properties 文件的操作简介在 Java 中,我们常用 java.ut ...

  2. java method 注解_JAVA 注解详解及简单实例

    JAVA 注解详解及简单实例 何为注解 注解(Annotation)又称为元数据,在JDK1.5后引入,它的作用是: 生成文档  这是注解的原始用途,可以通过注解生成JavaDoc文档 跟踪代码的依赖 ...

  3. java file 实例_Java File类的详解及简单实例

    Java File类的详解及简单实例 1. File():构造函数,一般是依据文件所在的指定位置来创建文件对象. CanWrite():返回文件是否可写. CanRead():返回文件是否可读. Co ...

  4. java多线程教程_java 基础教程之多线程详解及简单实例

    java 多线程详解 在这篇文章里,我们关注多线程.多线程是一个复杂的话题,包含了很多内容,这篇文章主要关注线程的基本属性.如何创建线程.线程的状态切换以及线程通信. 线程是操作系统运行的基本单位,它 ...

  5. java 线程死锁简单例子_java 多线程死锁详解及简单实例

    java 多线程死锁 相信有过多线程编程经验的朋友,都吃过死锁的苦.除非你不使用多线程,否则死锁的可能性会一直存在.为什么会出现死锁呢?我想原因主要有下面几个方面: (1)个人使用锁的经验差异 (2) ...

  6. java switch小程序,微信小程序 switch组件详解及简单实例

    微信小程序switch 相关文章: 实现效果图: 开关选择器 属性名 类型 默认值 说明 checked Boolean false 是否选中 disabled Boolean false 是否禁用 ...

  7. java中北大学ppt总结+课后习题第二章(小宇特详解)

    java中北大学ppt总结+课后习题第二章(小宇特详解) 基本数据类型 Java语言有8种基本数据类型. 逻辑类型:boolean.1字节 整数类型: 1字节整数类型:byte. 2字节整数类型:sh ...

  8. java获取request body_HttpServletRequest获取body内容(字符串/二进制)详解

    首页 > Java Web > SpringMvc应用 > HttpServletRequest HttpServletRequest获取body内容(字符串/二进制)详解 获取HT ...

  9. java中String s=abc及String s=new String(abc)详解

    java中String s="abc"及String s=new String("abc")详解 1.   栈(stack)与堆(heap)都是Java用来在R ...

最新文章

  1. Site Group Level Price Maintenance in IS Retail
  2. element-ui表格列金额显示两位小数
  3. sharepointa嵌入HTML网页,显示存储在SharePoint文档文件夹中的HTML页面
  4. Linux php 中文乱码解决
  5. Vim案列掌握vim的基本操作——案例一:vim创建编写txt文件
  6. 在新建FileInputStream时使用当前相对路径或者绝对路径作为参数的问题
  7. 服务器多网站布置,如何在一台服务器上实现多个web站点的方法
  8. 什么高大填空四个字动人_雅思考试的技巧?雅思听力part4填空做题技巧分享
  9. HDU 6356.Glad You Came-线段树(区间更新+剪枝) (2018 Multi-University Training Contest 5 1007)...
  10. 微软内核工程师:ReactOS 剽窃了 Windows 研究内核代码!
  11. 【QA】哈工大张伟男:任务型对话系统
  12. 快速排序中pivot的选取策略
  13. 基于正点原子STM32的OLED显示实验
  14. 数据分析的软件最全场景盘点
  15. 解读《美国国家BIM标准》– BIM能力成熟度模型(十)
  16. 声卡接口Line in、Line out、Mic in和Speak out
  17. 【抓否】哪来的“独角兽”——360私有化,富士康开飞机上市,宁德时代、药明康德这一系列闪电过会
  18. 【问题】eletron引入flash显示“无法加载插件”
  19. geekeyes kali安装edb
  20. ChatGPT时代,推荐几个宝藏公众号!

热门文章

  1. NSARRAY的 内存管理
  2. IDEA主题设置与eclipse代码风格一致
  3. 安卓如何修改华强北二代耳机敲击指令?
  4. JMeter插件模拟发送UDP请求:UDP sampler
  5. String类与其他数据类型得转换
  6. 数据结构实验四 排序算法的实现
  7. websocket使用
  8. C语言编程快速入门黎明,何用C语言模拟键盘输入?
  9. VS2017社区版30天到期无法使用的激活方法
  10. NLayerAppV3--.net Core2实现的DDD分层架构