当前课程知识点:Java程序设计 > 第四章 接口与多态 > 4.2.1-4.2.2-类型转换 > 类型转换
大家好
欢迎回来继续学习
JAVA语言程序设计
这一节我们来学习类型转换
类型转换又称为塑型
type-casting
那从转换的方式角度呢
可以分为隐式的转换
和显式的转换
从转换的方向的角度呢
可以分为向上转型和向下转型
现在我们来看一下转换规则
我们知道基本类型的数据
它们之间进行类型转换的时候
是将数据的值
从一种类型转换成另外一种类型
那么这一节中
我们重点介绍引用类型的变量
它的类型转换
那么这个转换指的就是
将引用转换为另一个类型的引用
那这种转换并不改变
对象本身的类型
引用变量呢
它的转换只能是这样的情况
首先可以转换为任何一个
直接或间接的超类类型
这属于向上转型
另外我们看这个引用变量
它指向的这个对象
所属的类是否实现过接口
或者说它指向的这个对象
它的超类是否实现过某些接口
那么如果实现过接口的话
指向这个对象的引用
就可以转换成接口的类型
实际上这也是一种向上转型
因为接口是继承的设计嘛
那么唯一一种情况下
可以实现完全的向下转型
那是什么情况呢
这个时候我们就要看一个引用
也许它是某个接口类型
或者某个超类类型的
但是它可以指向一个
实现接口的类的对象
或者它指向了一个子类的对象
这样的情况下
那么实际上就是说
它是一个上级类型的引用
但是真实的指向了一个
下级类型的对象
那么唯一在这种情况下
可以向下转型
将类型转为这个引用
所指向的对象的类型
这是唯一的
可以向下转型的情况
那么当一个引用被转换为
它的超类的引用以后
实际上它能访问的这个服务接口
就受限制了
同样如果一个引用
被转换为接口的引用以后
那也是一样的
它通过这个引用
能访问的服务接口就受限制的
也就是说我们要看这个引用
它本身是哪个类型的
那么通过这样的引用
只能访问它自己所属这个类型中
声明过的方法
或者它自己所属的这个接口中
声明过的方法
这就是我们对引用类型的变量
进行类型转换的时候
应该遵循的一些规则
现在我们通过这个图来看一下
这个类型转换的例子
看看能够进行什么样的转换
不能进行什么样的转换
我们看这里呢定义一个Person类
它隐含的是继承或者扩展了Object类
然后Employee雇员类
继承了Person类
Customer顾客类也继承了Person类
还有呢Manager管理人员类
继承了雇员类
除此而外呢这个Person
它是实现了Insurable接口的
可保险的这个接口
人是可以被投保的嘛
对吧
Insurable
另外呢公司,汽车
都是Insurable
都是可以被投保的
所以从可以被保险这个角度来看
它们可以有共同的对外接口
所以把这一组
可以被保险的这个对外接口
规定在Insurable这个接口里面
好 现在来看呢
这个Manager类型的引用
能够被转型为什么类型
按照继承的层次呢
它当然可以被转型为Employee
雇员类
子类对象总是可以充当
超类对象用的
所以Manager类型的引用呢
转成Employee类型的引用是可以的
在向上转成Person类型
转成Object类型的引用都是可以的
由那么于Person实现了Insurable接口
所以Manager还可以向上转型
为Insurable类型
但是Manager类型的引用
却不能转型为Customer
Company或者Car
因为它们之间没有继承关系
也不是实现接口的关系
类型转换分为隐式的转换
和显式的转换
隐式的转换呢
又称为自动转换
显式的转换又称为强制类型转换
接下来我们就分别看一下
这两种转换的情况
首先我来看隐式类型转换
我们知道基本数据类型的数据之间
它们的隐式转换
会发生在什么情况呢
发生在哪些可以转换的类型之间
当需要从存储容量比较低的类型
转换成存储容量比较高的
类型的时候呢
那么这个时候会发生自动的转换
因为这样的转换呢
它是不会丢失数据的
而引用变量呢
当它需要将一个更具体的类
或者更下级的子类
转换成一个更一般的类
或者是上层的超类的时候呢
这个时候可以发生隐式的转换
比如说我们看一下这个例子
我们在前面那个图中看到了
这个在类的继承层次中呢
这个manager类
是继承了employee类的
所以employee是超类
manager是employee的子类
这个时候我们定义一个
employee类型的引用emp
但是我们构造一个manager对象
那么构造的结果
new运算的结果
就会产生一个manager类型的引用
我们将这个引用赋值给employee的时候
那么这个时候就发生了
隐含的类型转换
将manager引用转换成了employee引用
这是将子类型的引用
转换成超类型的引用
那么下面我们再看下面这个例子
在这个例子中呢
我们构造了一个汽车类型的对象
car对象
那么将这个对象的引用呢
赋值给car类型的引用变量jetta
然后又定义了一个Insurable
这个接口类型的引用
我们知道car是实现了Insurable的类
所以我们可以样car引用
赋给Insurable引用
在这个赋值的时候
就发生了隐式的或者自动的转换
它是将实现了接口的类
它的对象引用
转换成了接口类型的引用
接下来我们再来看显式类型转换
首先我们还是先看
我们熟悉的基本类型数据的转换
比如说我们要将一个double类型的
文字常量871.34354
转换成int类型
这个时候就必须通过显式转换来实现了
因为隐含的自动转换
它只会向高类型方向转换
因为不丢失数据
但是你要从高类型
向低类型转换的话
那就不会自动发生了
这个时候需要显式类型转换
我们在这儿规定
要将它转换成int类型
这个时候是直接截掉小数部分
只保留整数部分
那么这个时候是有数据丢失的
那么另外两个例子也是一样
都是通过显式的给出类型名来
指定这个显式转换
那么引用变量呢
当我们需要进行显式转换的时候
也是要显式的给出
转换的目标的这个类型名
比如这里我们定义了这个
employee类型的引用emp
还是像刚才例子一样
我们构造了manager的对象
将这个对象引用赋值给emp
这个时候发生了隐含转换
将子类型的对象引用
转换成了超类的对象引用
那么这个时候由于
这个emp这个引用变量
它实际指向的对象就是子类对象
这一点是我们可以肯定的
所以在这种情况下
我们可以强制性的将这个emp这个引用
转换成子类型
转换成子类的manager引用
再赋值给man
这个引用转换是不会自动发生的
我们必须写出manager这个类型名来
去强制转换
这种强制转换不会发生错误
能够正确运行
就是因为emp真正指向的对象
确实是manager类型
如果不能肯定这一点
那么就绝对不要向下转型
因为向下转型
在大多数你不能确定情况的时候
那么它是不能正确的
只有在类似这种情况下
我们确切的知道emp
指向的就是manager
那么我们就可以做向下转型
类型转换
它的主要应用场合包括哪些呢
包括赋值转换
方法调用转换
还有算术运算转换
以及字符串拼接的时候
发生的这种转换
赋值转换呢
指的是将赋值运算符右边的表达式
或者对象类型呢
转换成左边的类型
方法调用转换呢
指的是将实参的类型
转换为形参的类型
而算术表达式转换指的是
在算数混合运算的时候
也就是不同类型的数据
混合进行算术运算的时候
那么首先会将不同类型的操作数
转换为相同类型的
然后再进行运算
字符串转换呢
指的是在进行字符串连接运算
也叫字符串拼接运算的时候呢
那么看看如果一个操作数是字符串
另一个操作数不是字符串
是其他类型
那这个时候会自动
将其他类型的这个对象
转换为字符串类型
然后再进行字符串连接运算
下面我们就以一个图为例子
来体会一下这个类型转换
我们看这个图上的这个继承关系
manager类继承了employee类
然后这个employee类呢
继承了这个person类
在person类中声明了getname方法
在employee中声明了
getemployeenumber方法
那么当我们将manager类型的引用
转换成employee引用的时候
这个时候就只能访问employee类
以及它的超类中的方法了
像getname getemployeenumber这种方法
都可以通过employee引用去访问
那么manager类中
自己声明的getSalary方法
就不能通过它超类的引用
比如employee的引用去访问了
那么如果说在将一个manager类型的引用
向上转型为employee引用之后
这个引用实际仍然指向manager对象
那么就可以继续把它再转回来
也就是在这种特殊情况下
我们原来讲了可以向下转型的
对吧
转回来以后
就又可以接受getSalary方法了
好 在这一节中呢
我们学习了关于类型转换的基本概念
类型转换的规则
它的主要应用场合
以及一些简单的例子
好 这一节内容就是这样
-1.0-导学
--1.0-导学
-1.1-Java与面向对象程序设计简介
--第一章 Java语言基础知识--1.1-Java与面向对象程序设计简介
-1.2-基本数据类型与表达式
-第一章 Java语言基础知识--1.2-基本数据类型与表达式
-1.3-数组
--1.3.1-数组
-第一章 Java语言基础知识--1.3-数组
-1.4-算法的流程控制
--第一章 Java语言基础知识--1.4-算法的流程控制
-1.5-第一章小结
-第一章编程练习题
-课件
--外部链接
-Java环境配置、Eclipse使用、Helloworld程序详解
--使用eclipse建立Java项目、编写和运行Java程序
-Java数据类型
--Java整数类型
--Java浮点类型
--数据类型实战
--数据类型转换
--Java强制类型转换精度损失示例与表达式中的数据类型转换
-Java数组
-Java变量
--Java的变量
-命令行参数
--命令行参数的介绍
-2.0-导学
--2.0-导学
-2.1-面向对象方法的特性
--第二章 类与对象--2.1-面向对象方法的特性
-2.2-1-类声明与对象创建
--第二章 类与对象--2.2-1-类声明与对象创建
-2.2-2-数据成员
--第二章 类与对象--2.2-2-数据成员
-2.2-3-方法成员
--第二章 类与对象--2.2-3-方法成员
-2.2-4-包
--2.2-4-包
--第二章 类与对象--2.2-4-包
-2.2-5-类的访问权限控制
--第二章 类与对象--2.2-5-类的访问权限控制
-2.3-1-对象初始化
--第二章 类与对象--2.3-1-对象初始化
-2.3-2-内存回收
--第二章 类与对象--2.3-2-内存回收
-2.4-枚举类
--2.4-枚举类
--第二章 类与对象--2.4-枚举类
-2.5-应用举例
--2.5-应用举例
-2.6-第2章小结
-第二章编程练习题
-课件
--第二章课件
-3.0-导学
--3.0-导学
-3.1.1-3.1.2-类继承的概念和语法
--第三章 类的重用--3.1.1-3.1.2-类继承的概念和语法
-3.1.3-隐藏和覆盖
--第三章 类的重用--3.1.3-隐藏和覆盖
-3.2-Object 类
--第三章 类的重用--3.2-Object 类
-3.3-终结类与终结方法
--第三章 类的重用--3.3-终结类与终结方法
-3.4-抽象类
--3.4-抽象类
--第三章 类的重用--3.4-抽象类
-3.5-泛型
--3.5-泛型
--第三章 类的重用--3.5-泛型
-3.6-类的组合
--3.6-类的组合
-3.7-小结
--3.7-小结
-第三章编程练习题
-课件
--课件
-4.0-导学
--导学
-4.1-接口
--接口
--第四章 接口与多态--4.1-接口
-4.2.1-4.2.2-类型转换
--类型转换
--第四章 接口与多态--4.2.1-4.2.2-类型转换
-4.2.3-方法的查找
--方法的查找
--第四章 接口与多态--4.2.3-方法的查找
-4.3-多态的概念
--多态的概念
--第四章 接口与多态--4.3-多态的概念
-4.4-多态的应用举例
--多态的应用举例
--第四章 接口与多态--4.4-多态的应用举例
-4.5-构造方法与多态性
--构造方法和多态性
--第四章 接口与多态--4.5-构造方法与多态性
-4.6-本章小结
--本章小结
-第四章编程作业
-课件
--课件
-5.0-导学
--5.0-导学
-5.1.1-5.1.2-异常处理的概念
--第五章 输入输出--5.1.1-5.1.2-异常处理的概念
-5.1.3-5.1.5-异常的处理
--第五章 输入输出--5.1.3-5.1.5-异常的处理
-5.2-输入输出流的概念
--输入输出流的概念
--第五章 输入输出--5.2-输入输出流的概念
-5.3.1-写文本文件
--写文本文件
--第五章 输入输出--5.3.1-写文本文件
-5.3.2-读文本文件
--读文本文件
--第五章 输入输出--5.3.2-读文本文件
-5.3.3-写二进制文件
--写二进制文件
--第五章 输入输出--5.3.3-写二进制文件
-5.3.4-读二进制文件
--读二进制文件
-5.3.5-File类
--File类
-5.3.6-处理压缩文件
--处理压缩文件
-5.3.7-对象序列化
--对象序列化
-5.3.8-随机文件读写
--随机文件读写
-5.4-本章小结
--本章小结
-课件
--课件
-6.0-导学
--导学
-6.1-Java集合框架介绍
--第六章 对象群体的组织--6.1-Java集合框架介绍
-6.2-主要接口及常用的实现类
--第六章 对象群体的组织--6.2-主要接口及常用的实现类
-6.3-常用算法
--常用算法
-6.4-数组实用方法
-6.5-基于动态数组的类型(Vector, ArrayList)
--基于动态数组的类型(Vector, ArrayList)
-6.6-遍历Collection
-6.7-Map接口及其实现
-6.8-第6章小结
--第6章小结
-课件
--课件
-7.0-导学
--导学
-7.1-绘图
--绘图
-7.2-Swing基础
--Swing基础
-7.3-Swing的层次
--Swing的层次
-7.4-布局管理
--布局管理
-7.5-内部类
--内部类
-7.6-事件处理的基本概念
-7.7-事件派发机制
--事件派发机制
-7.8-顶层容器
--7.8-顶层容器
-7.9-中间层容器(一)
-7.10-中间层容器(二)
-7.11-原子组件(一)
-7.12-原子组件(二)
-7.13-原子组件(三)
-7.14-其它Swing特性
-7.15-第7章小结
-课件
--课件