强制类型转换在Java中大量使用,与继承、接口实现、多态都相关,非常重要,如果没有强制类型转换,很多功能可能都没有办法实现。而在实际使用过程,对它的理解和使用总是有一些误解,下面对它进行比较详细的分析。首先看看两个场景。
引子1:
在课堂上问过学生这样一个问题:“在Java中如何把一个表示数字的字符串转换成数字呢?”
在不同的班级中有多个同学回答:“使用强制类型转换”
我继续问,“代码如何写?”
有的学生答“int i = (int) s”,s是字符串,有的学生答“int i = Integer.parseInt(s)”
前者写的是强制类型转换的代码,但是是错误的,而后者是对的,但是不是强制类型转换。
引子2:
在指导学生实训的时候,很多时候要使用工具类List或者Map,因为List或者Map中可以存储任何类型的数据,所以取出数据之后需要转换成需要的类型,学生这时候把强制类型转换理解成是万能的,想把结果转换成什么类型就转换成什么类型。其实这种想法是错误的,并且有这种想法的人还很多。
“强制类型转换”,从字面上看,就是把一个类型强制转换成另外一个类型。是不是这样呢?在Java中,对象的实例化是根据类型来的,也就是说对象在创建的时候类型就已经确定了,是不能变化的。
那“强制类型转换”是怎么回事呢?实际上,这里说的类型转换是把一种类型的对象引用指向另一种类型的引用指向的对象实例。例如:
Animalaninal = new Dog();
Dog dog = (Dog)animal;
第1行把aninal指向Dog的实例(通过new实例化),第2行让Dog类型的对象引用dog指向Aninal类型的animal引用所指向的实例。实际上这里并没有发生什么类型转换,因为animal本身指向的就是一条狗,所以把dog指向了animal指向的实例,也就是把dog指向了一条狗。真的没有类型转换!!!
为什么需要这样的语法呢?生活中,我们看到一条狗会说这是一条狗(Dog dog=new Dog()),看到一只猫会说这是一只猫(Cat cat=new Cat())。但是有时候,当我们看到一条狗的时候,我们会说这是一个动物(实际上这个动物是一条狗,Animal animal=new Dog()),然后你可能会说这只动物是狗。就像你给小孩讲故事,“大树下面有一只动物,它是一条狗”。但是我们知道动物它不一定就是狗,如果你认为它是一条狗,就用强制类型转换吧,其实就是声明一下这个动物真的是狗(Dog dog=(Dog)animal)。
会不会有这样的情况呢?你看走了眼,它不是狗而是狗科的狼。如果是这样,程序在编译的时候不会抱错,但是在运行的时候就会出错了,就是著名的ClassCastException。下面是一个典型的例子:
Aninal animal = new Cat();
Dog dog = (Dog)aninal;
从语法上没有错误,但是因为你看走眼了,运行时就错了。当然这样的走眼应该不会发生,什么时候会发生这样的错误呢?你调用了某个方法返回了一个Animal,你理所当然就认为它是Dog,就转换成了Dog,如果它不是Dog,就会出错了。如果你肯定它就是Dog就可以这样做,如果不确定怎么办呢?
首先,判断是不是Animal,因为它可能什么都不是,是null。
其次,使用instanceof判断它的类型,然后再处理:
if animal instanceof Dog
Dog dog = (Dog)animal;
不知道你对强制类型转换的作用理解了没有,简单的记住下面的话:
要想把一只动物转换成为狗,首先它必须是狗。强制类型转换就是要告诉编译器它确实是一条狗。
分享到:
相关推荐
但通过强制类型转换,使等式两边满足 包装类与基础类型相对应,装箱或拆箱会自动完成。 2:低范围包装类型是允许直接转换为高范围的基础类型,逻辑上也说得通 3:而低范围的基础类型也是不能直接转为高范围的包装...
协议转换器 研究假设 测试过的协议转换网关 研究方法 仿真器 分析器 实际上的测试情况 研究结果 停止响应 针对转换器做 DoS 攻击 绕过协议转换 演示: Nexcom 攻击链 数据站 (Data Stations) 任意写漏洞 影响 攻击...
谈谈辩证法问题读书笔记.doc
谈谈ChatGPT是否可以替代人谈谈ChatGPT是否可以替代人谈谈ChatGPT是否可以替代人谈谈ChatGPT是否可以替代人谈谈ChatGPT是否可以替代人谈谈ChatGPT是否可以替代人谈谈ChatGPT是否可以替代人谈谈ChatGPT是否可以替代人...
谈谈辩证法问题.pdf,这是一份不错的文件
如何提高单片机的模数转换精度,对于ADC非常实用,几乎所以单片机应用都用到ADC。
谈谈C语言中构造类型数据.pdf
参考资料-谈谈如何提高单片机的模数转换精度.zip
结合当前的形势-谈谈你对我国小学数学教育的看法.pdf
强制缓存 当缓存数据库中已经有了请求的数据时,如果没有,客户端则会从服务器获取数据,如果有,客户端会直接从缓存数据库中获取数据,期间并不发送服务器请求,返回状态码为200(from cache) 强制缓存可以...
谈谈关于NVMe和NVMe-oF的那些事.docx
笛卡尔 谈谈方法 这本书对于人的思维与研究都很有帮助
07读《谈谈儒家思想对世界经济的重要贡献》有感-.doc
STM32单片机FPGA毕设电路原理论文报告谈谈如何提高单片机的模数转换精度本资源系百度网盘分享地址
结合经验谈谈在心理咨询中应如何建立良好的帮助关系.pdf
联系实际谈谈如何提高学习者的自我监控能力.pdf
谈谈合同谈谈合同效力的应用.doc
谈谈辩证法问题读后感参考.doc
谈谈你对机器人的认识.doc