谈谈强制类型转换
强制类型转换在Java中大量使用,与继承、接口实现、多态都相关,非常重要,如果没有强制类型转换,很多功能可能都没有办法实现。而在实际使用过程,对它的理解和使用总是有一些误解,下面对它进行比较详细的分析。首先看看两个场景。
引子1:
在课堂上问过学生这样一个问题:“在Java中如何把一个表示数字的字符串转换成数字呢?”
在不同的班级中有多个同学回答:“使用强制类型转换”
我继续问,“代码如何写?”
有的学生答“int i = (int) s”,s是字符串,有的学生答“int i = Integer.parseInt(s)”
前者写的是强制类型转换的代码,但是是错误的,而后者是对的,但是不是强制类型转换。
引子2:
在指导学生实训的时候,很多时候要使用工具类List或者Map,因为List或者Map中可以存储任何类型的数据,所以取出数据之后需要转换成需要的类型,学生这时候把强制类型转换理解成是万能的,想把结果转换成什么类型就转换成什么类型。其实这种想法是错误的,并且有这种想法的人还很多。
“强制类型转换”,从字面上看,就是把一个类型强制转换成另外一个类型。是不是这样呢?在Java中,对象的实例化是根据类型来的,也就是说对象在创建的时候类型就已经确定了,是不能变化的。
那“强制类型转换”是怎么回事呢?实际上,这里说的类型转换是把一种类型的对象引用指向另一种类型的引用指向的对象实例。例如:
Animal aninal = 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;
不知道你对强制类型转换的作用理解了没有,简单的记住下面的话:
要想把一只动物转换成为狗,首先它必须是狗。强制类型转换就是要告诉编译器它确实是一条狗。
李绪成 CSDN Blog:http://blog.csdn.net/javaeeteacher
邀请您为好友:http://student.csdn.net/invite.php?u=124362&c=7be8ba2b6f3b6cc5
补充:软件开发 , Java ,