1 向上转型

1.1 为何叫向上转型

 在面向对象程序设计中,针对一些复杂的场景,我们通常画一个UML图来表示各个类之间的关系,通常父类画在子类的上方,因此我们就称之为"向上转型",表示往父类的方向转.

向上转型发生的时机:

  • 直接赋值;
  • 方法传参;
  • 方法返回.

1.2 理解向上转型

我们先来看以下代码(以下代码为上文代码中的一部分):

猫咪本身是一种动物,cat是一个父类(Animal)的引用,指向的是一个子类(Cat)的实例,这种写法称之为向上转型.

2 向下转型

2.1 背景概念

 由上文我们可以知道向上转型是子类对象转成父类对象,那么向下转型便是父类对象转成子类对象,也就是说子类对象总是父类的一个实例,但父类对象不一定是子类的实例,相比于向上转型,向下转型不是很常见.
 学习向下转型,我们还要知道另外一个概念:显示类型转换.

显示类型转换:越是具体的对象,具有的特性越多;越是抽象的对象,具有的特性越少.在做向下转型操作时,将特性范围小的对象转换为特性范围大的对象肯定会出现问题,所以这时候必须得告知编译器某些特性,将父类对象强制转换为某个子类对象,这便是显示类型转换.

2.2 问题示例

我们将上文中动态绑定中的部分代码稍作修改,如下所示:

代码解读: 编译过程中,animal类型是Animal,此时编译器只知道这个类中有一个eat方法,没有fly方法,虽然animal实际引用的是一个Bird对象,但是编译器是以animal的类型来查看有哪些方法的,针对

Animal animal = new Bird(“麻雀”)

这样的代码:

  • 编译器检查有哪些方法存在时,看的是Animal这个类型;
  • 执行时究竟执行的是父类的方法还是子类的方法,则看的是Bird这个类型.


如果我们要想实现fly()这个方法,该如何做呢???
方法一: 如果将animal进行强制类型转换可以么?? 我们来试一下:

public static void main(String[] args) {Animal animal = new Bird("麻雀");animal.eat("小米");Bird bird = (Bird) animal;bird.fly();}

运行结果:

虽然已经运行成功了,但是总觉得有些不靠谱,如下代码:

public static void main(String[] args) {Animal animal = new Cat("猫咪");Bird bird = (Bird)animal;bird.fly();}

运行结果:

因为animal本质上引用的是一个Cat对象,是不能转成Bird对象的,因此就抛出了异常,所以这样的向下转型有局限性,是行不通的.
方法二: 为了避免在向下转型时抛出异常,我们可以先判定一下animal本质上是不是一个Bird实例,然后再进行转换,代码如下:

public static void main(String[] args) {Animal animal = new Cat("猫咪");if (animal instanceof Bird) {Bird bird = (Bird)animal;bird.fly();}}

这时候就不会抛出异常!!

instanceof可以判定一个引用是否是某个类的实例,如果是返回true.
在Java语言中的关键字都是小写!

Java 基础系列(十) --- 什么是向上转型和向下转型相关推荐

  1. Java 基础系列(十六) --- Java中模板引擎的使用

    模板引擎 1 关于动态页面的渲染 2 非模板引擎的弊端 3 模板引擎 3.1 什么是模板引擎? 3.2 Thymeleaf 语法 3.3 模板引擎的使用 4 总结 1 关于动态页面的渲染   渲染就是 ...

  2. java基础系列十七(时间日期转换)

    目录 一.概述 二.基础知识 2.1 时区 2.2 格林威治时间 2.3 时间戳 三.Date/Calendar/SimpleDateFormat 3.1 Date 3.2 Calendar 3.3 ...

  3. 重新精读《Java 编程思想》系列之向上转型与向下转型

    前言 今天重读了一下向上转型与向下转型,有些新的体会,了解了向上转型的好处,及如何向下转型.在此分享给大家. 向上转型 向上转型是用来表现新类和基类之间的关系.在传统中,由导出类转型成基类,在继承图中 ...

  4. Java基础系列五 面向对象程序设计

    Java基础系列第一章 初识Java语言 Java基础系列第二章 Java语言基础 Java基础系列第三章 Java流程控制 Java基础系列第四章 Java数组与字符串 Java基础系列第五章 面向 ...

  5. 夯实Java基础系列6:一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  6. 夯实Java基础系列1:Java面向对象三大特性(基础篇)

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  7. 【Java挠头】继承、抽象、接口、多态、向上转型、向下转型等精妙干货

    –本文摘要–     1.本文的目标读者:是了解Java基础,且对面向对象概念有所了解,但是对Java中继承.抽象类.接口.多态等等概念搞不清的初学者.     2.本文的内容摘要:讲述Java中的一 ...

  8. Java学习系列(十)Java面向对象之I/O流(上)

    IO流 我们知道应用程序运行时数据是保存在内存中的,但由于内存中的数据不可持久保存(如断电或程序退出时数据会丢失),因此需要一种手段将数据写入硬盘或读入内存.面向IO流编程就是一种很好的选择.IO:I ...

  9. Java基础系列【导读】

    Java基础系列导读 Java基础 JaveWEB Java基础 基础系列[一]-- Java语言介绍 基础系列[二]-- 环境搭建 基础系列[三]-- Java基础语法 基础系列[四]-- 面向对象 ...

最新文章

  1. 值得推荐的Idea十二大优秀插件
  2. 绩效管理误区和乱象,你的企业存在吗?
  3. MySql: 常见错误
  4. 方法论、方法论——程序员的阿喀琉斯之踵
  5. CSS3 总结(一)
  6. Struts 验证框架实现步骤
  7. 【面试必备!Mac版本】一文打通Git教程!史上最硬核解析!——双非上岸阿里巴巴系列
  8. java内存泄漏总结
  9. Sphere-AABB Intersecting test
  10. Poj 2421 Constructing Roads(Prim 最小生成树)
  11. CasperJS 实现百度登录
  12. 三阶魔方大中小魔公式_三阶魔方花样玩法,公式汇总
  13. 掌握这个小技巧,让你的 C++ 编译速度提升 50 倍!
  14. 对话框(06):【类】QFontDialog [官翻]
  15. 监督学习、无监督学习、半监督学习和强化学习
  16. 第1040期机器学习日报(2017-07-24)
  17. DPU-PYNQ使用笔记
  18. Intel体系MMX指令指令说明
  19. 安卓 获取屏幕坐标(点击屏幕获取坐标)
  20. 独家 | 关于数据管理标准化工作的思考

热门文章

  1. 从 React 到 Preact 迁移指南
  2. android网络是否可用,android 判断网络是否可用与连接的网络是否能上网
  3. js数组中indexOf和findIndex的区别
  4. java输入输出换行程序_java文件输出换行问题。
  5. java转换中文乱码_java中文乱码解决之道(四)-----java编码转换过程
  6. 一、什么Docker? Docker有什么用?Docker能干嘛?
  7. 计算机windows7更新失败,Win7自动更新失败开不了机怎么办?
  8. 常用的xpath定位,通过一个元素去定位另一个元素,基本上能解决工作中所有定位
  9. 逐步视频讲解--用Tensorflow进行中文自然语言处理--情感分析
  10. 最新二开APP分发PHP程序源码+免IOS/免签封包分发