Java多态之向下转型
Java多态之向下转型
往期回顾:我们学习了向上转型和动态绑定的概念,可以知道在继承关系中,将一个子类对象赋值给父类的引用变量,调用父类的方法,在实际运行时,就可以根据子类中重写的方法执行不同的操作。其中有一个弊端,就是在向上转型的过程中,其实丢失了一部分子类特有的功能,毕竟它只允许调用父类中的方法。那么,如何在这时调用子类中的方法呢,这时就需要与向上转型相对应的方法,就是所谓的:向下转型。
向上转型是自动就能完成的,向下转型则需要强制类型转换。
强制类型转换
我们前面提到过基本数据类型的强制转换,可以查看之前的文章:基本数据类型转换
引用变量的强制类型转换与基本数据类型类似,都需要用到类型转换运算符:()。
//将变量强制转换为type类型
type p = (type)变量
特别注意:
- 基本数据类型中,数值类型和布尔类型无法进行类型转换。
 
//错误!
boolean boo = true;
int in = (int)boo;
- 不在继承关系中的两个类型无法进行强制类型转换。
 
//假设Person类和Dog类不具有继承关系,则下面会出错
Person p = new Person();
Dog dog = (Dog)p;
- 就算在继承关系中,也不能把父类的实例转换成子类类型。(也就是说,引用变量必须编译时是父类类型,运行时是子类类型才可以)注意,编译时是不会报错的,只有运行时才会报错。
 
//假设Student继承于Person类
//编译时正常,运行时出错
Person p = new Person();
Student s = (Student)p;
instanceof
将一个父类引用赋给一个子类变量时,必须经过强制类型转换。如果出现强制类型转换双方不匹配的话,运行时通过(RTTI  Run-Time Type Identification),即运行时类型识别,检查并返回ClassCastException,即类型转换异常。
为了避免这一尴尬的问题发生,我们可以用instanceof运算符来检查,确保程序的健壮性。
instance是实例的意思,可想而知,instanceof表示判断前面的对象是否是后面的类,或者子类,实现类的实例。如果是就返回true,否则就false。
[引用类型变量] instanceof [类(接口)]
从上面诸多错误例子中随便举一个:
//在强制类型转换前加上instanceof语句判断
Person p = new Person();
if (p instanceof Student) {
Student s = ((Student) p);
}
这时,if判断语句中为false,里面自然无法执行,也就避免程序报错,保证了程序的健壮性。
Java多态之向下转型的更多相关文章
- java 多态 向上 向下转型
		
向上转型 将子类对象当作父类对象 子类对象------>父类对象 先实例化子类 父类 父类对象 = 子类实例 package test2; class Father{ public vo ...
 - java 向上,向下转型
		
在对Java学习的过程中,对于转型这种操作比较迷茫,特总结出了此文.例子参考了<Java编程思想>. 目录 几个同义词 向上转型与向下转型 例一:向上转型,调用指定的父类方法 例二:向上转 ...
 - java中的向下转型
		
1.父类对象可以强制转换为子类对象,但是前提是此父类对象为子类对象实例化的结果. e.g. Fruit fruit=new Apple(); Apple a=(Apple)fruit;//ok e.g ...
 - java中downcast向下转型到底有什么用
		
What is the point of downcast? 当一个方法只有子类才有,马克-to-win:不是说基类和子类都有,开始时又是基类指针指向派生类,这时就需要downcast, see th ...
 - 《java入门第一季》之面向对象(多态向下转型)
		
上一篇博客(http://blog.csdn.net/qq_32059827/article/details/51328638)最后对多态的弊端做了显示,这里解决这个弊端.如下: /* 多态的弊端: ...
 - 多态Poly中的向上/下转型 Upcast/Downcast
		
[参考资料]马克-to-win java中多态polymorphism,向上转型和动态方法调度有什么用? java中什么叫多态,动态方法调度(dynamic method dispatch)? jav ...
 - Java向上转型和向下转型(附具体样例)
		
Java向上转型和向下转型(附具体样例) 熬夜整理的关于Java向上和向下转型的样例,很的通俗易懂哦~~~~ 一 ...
 - 重新精读《Java 编程思想》系列之向上转型与向下转型
		
前言 今天重读了一下向上转型与向下转型,有些新的体会,了解了向上转型的好处,及如何向下转型.在此分享给大家. 向上转型 向上转型是用来表现新类和基类之间的关系.在传统中,由导出类转型成基类,在继承图中 ...
 - 09-02 java 多态
		
多态的前提.多态的特点 /* 多态:同一个对象(事物),在不同时刻体现出来的不同状态. 举例: 猫是猫,猫是动物. 水(液体,固体,气态). 多态的前提: A:要有继承关系. B:要有方法重写. 其实 ...
 
随机推荐
- Code Helper占用大量CPU和内存
			
项目架构: React+TS+DVA 设备及软件: 设备:Mac 软件:VSCode 场景: 在Mac中使用VSCode运行时发现项目编译非常卡顿,时间长达五六分钟以上,并且项目启动后访问页面,页面也 ...
 - python logger日志通用配置文件
			
阅读须知⚠️ 1.示例代码可直接放在项目py文件中即可使用 2.project_name,logfile_name变量需根据你的项目进行修改 3.日志输出格式format选择(可根据你的需要替换或修改 ...
 - 2019-10-31:渗透测试,基础学习,mongodb注入学习
			
mongodb命令删除文档,db.集合名.remove({键:值})更新文档,db.集合名.update({被更新的对象},{$set:{要更新的内容}}),默认只更新检测到的第一条文档更新全部匹配到 ...
 - 2019-10-30:渗透测试,基础学习,mssql堆叠内联注入,mongodb基础语法
			
使用xp_cmdshell需要堆叠注入,http://192.168.190.148/less-1.asp?id=1';EXEC sp_configure 'show advanced options ...
 - Mysql查询语句之排序查询
			
语法: /* select 查询列表 from 表 [where 筛选条件] order by 排序列表 [asc/desc] */ ①asc为升序,desc为降序,且默认为升序 ②order by子 ...
 - JVM(2)--深入理解java对象创建始终
			
java对象探秘 java是一门面向对象的语言,我们无时无刻不在创建对象和使用对象,那么java虚拟机是如何创建对象的?又是如何访问对象的?java对象中究竟存储了什么运行时所必需的数据?在学习了ja ...
 - C语言之修改常量
			
前言:指针!菜鸟的终点,高手的起点.漫谈一些进阶之路上的趣事:记录一些语言本身的特性以及思想,没有STL,也没有API! 0x01: 程序内存中的存储划分 对于程序在内存中是如何分布的,网上有多个解释 ...
 - Spring IOC容器装配Bean_基于XML配置方式
			
开发所需jar包 实例化Bean的四种方式 1.无参数构造器 (最常用) <?xml version="1.0" encoding="UTF-8"?> ...
 - mysql 忘记登录密码(修改root密码)
			
1.以管理员身份打开cmd,键入net stop mysql,停止mysql 2.切换到mysql的安装目录下(例:S:\mysql\mysql-8.0.18-winx64\mysql-8.0.18- ...
 - 漫谈LiteOS之开发板-串口(基于GD32450i-EVAL)
			
[摘要] 主要讲解物联网的技术积累,本期我们先带领大家学习漫谈LiteOS之漫谈开发板第一集-串口,本文基于GD32450i-EVAL对串口以及其通信做了一个简要的分析,以及开发过程中遇到的一些技术 ...