Java 基础系列(十) --- 什么是向上转型和向下转型
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 基础系列(十) --- 什么是向上转型和向下转型相关推荐
- Java 基础系列(十六) --- Java中模板引擎的使用
模板引擎 1 关于动态页面的渲染 2 非模板引擎的弊端 3 模板引擎 3.1 什么是模板引擎? 3.2 Thymeleaf 语法 3.3 模板引擎的使用 4 总结 1 关于动态页面的渲染 渲染就是 ...
- java基础系列十七(时间日期转换)
目录 一.概述 二.基础知识 2.1 时区 2.2 格林威治时间 2.3 时间戳 三.Date/Calendar/SimpleDateFormat 3.1 Date 3.2 Calendar 3.3 ...
- 重新精读《Java 编程思想》系列之向上转型与向下转型
前言 今天重读了一下向上转型与向下转型,有些新的体会,了解了向上转型的好处,及如何向下转型.在此分享给大家. 向上转型 向上转型是用来表现新类和基类之间的关系.在传统中,由导出类转型成基类,在继承图中 ...
- Java基础系列五 面向对象程序设计
Java基础系列第一章 初识Java语言 Java基础系列第二章 Java语言基础 Java基础系列第三章 Java流程控制 Java基础系列第四章 Java数组与字符串 Java基础系列第五章 面向 ...
- 夯实Java基础系列6:一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- 夯实Java基础系列1:Java面向对象三大特性(基础篇)
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- 【Java挠头】继承、抽象、接口、多态、向上转型、向下转型等精妙干货
–本文摘要– 1.本文的目标读者:是了解Java基础,且对面向对象概念有所了解,但是对Java中继承.抽象类.接口.多态等等概念搞不清的初学者. 2.本文的内容摘要:讲述Java中的一 ...
- Java学习系列(十)Java面向对象之I/O流(上)
IO流 我们知道应用程序运行时数据是保存在内存中的,但由于内存中的数据不可持久保存(如断电或程序退出时数据会丢失),因此需要一种手段将数据写入硬盘或读入内存.面向IO流编程就是一种很好的选择.IO:I ...
- Java基础系列【导读】
Java基础系列导读 Java基础 JaveWEB Java基础 基础系列[一]-- Java语言介绍 基础系列[二]-- 环境搭建 基础系列[三]-- Java基础语法 基础系列[四]-- 面向对象 ...
最新文章
- 值得推荐的Idea十二大优秀插件
- 绩效管理误区和乱象,你的企业存在吗?
- MySql: 常见错误
- 方法论、方法论——程序员的阿喀琉斯之踵
- CSS3 总结(一)
- Struts 验证框架实现步骤
- 【面试必备!Mac版本】一文打通Git教程!史上最硬核解析!——双非上岸阿里巴巴系列
- java内存泄漏总结
- Sphere-AABB Intersecting test
- Poj 2421 Constructing Roads(Prim 最小生成树)
- CasperJS 实现百度登录
- 三阶魔方大中小魔公式_三阶魔方花样玩法,公式汇总
- 掌握这个小技巧,让你的 C++ 编译速度提升 50 倍!
- 对话框(06):【类】QFontDialog [官翻]
- 监督学习、无监督学习、半监督学习和强化学习
- 第1040期机器学习日报(2017-07-24)
- DPU-PYNQ使用笔记
- Intel体系MMX指令指令说明
- 安卓 获取屏幕坐标(点击屏幕获取坐标)
- 独家 | 关于数据管理标准化工作的思考
热门文章
- 从 React 到 Preact 迁移指南
- android网络是否可用,android 判断网络是否可用与连接的网络是否能上网
- js数组中indexOf和findIndex的区别
- java输入输出换行程序_java文件输出换行问题。
- java转换中文乱码_java中文乱码解决之道(四)-----java编码转换过程
- 一、什么Docker? Docker有什么用?Docker能干嘛?
- 计算机windows7更新失败,Win7自动更新失败开不了机怎么办?
- 常用的xpath定位,通过一个元素去定位另一个元素,基本上能解决工作中所有定位
- 逐步视频讲解--用Tensorflow进行中文自然语言处理--情感分析
- 最新二开APP分发PHP程序源码+免IOS/免签封包分发