当前课程知识点:Java程序设计 >  第四章 接口与多态 >  4.2.1-4.2.2-类型转换 >  类型转换

返回《Java程序设计》慕课在线视频课程列表

类型转换在线视频

类型转换

下一节:方法的查找

返回《Java程序设计》慕课在线视频列表

类型转换课程教案、知识点、字幕

大家好

欢迎回来继续学习

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方法了

好 在这一节中呢

我们学习了关于类型转换的基本概念

类型转换的规则

它的主要应用场合

以及一些简单的例子

好 这一节内容就是这样

Java程序设计课程列表:

第一章 Java语言基础知识

-1.0-导学

--1.0-导学

--JDK的安装与配置01

--JDK的安装与配置02

--JDK的安装与配置03

--编辑并执行第一个java程序01

--编辑并执行第一个java程序02

--编辑并执行第一个java程序03

--eclipse的安装和配置01

--eclipse的安装和配置02

--eclipse的安装和配置03

--使用eclipse进行Java的开发01

--使用eclipse进行Java的开发02

--使用eclipse进行Java的开发03

-1.1-Java与面向对象程序设计简介

--1.1.1 Java与面向对象程序设计简介

--第一章 Java语言基础知识--1.1-Java与面向对象程序设计简介

-1.2-基本数据类型与表达式

--1.2.1-基本数据类型与表达式

-第一章 Java语言基础知识--1.2-基本数据类型与表达式

-1.3-数组

--1.3.1-数组

-第一章 Java语言基础知识--1.3-数组

-1.4-算法的流程控制

--1.4.1-算法的流程控制

--第一章 Java语言基础知识--1.4-算法的流程控制

-1.5-第一章小结

--1.5.1-第一章小结

-第一章编程练习题

-课件

--外部链接

第一章续-习题讲解视频

-Java环境配置、Eclipse使用、Helloworld程序详解

--JAVA的安装和配置

--编写并执行第一个Java程序及Java的跨平台性

--eclipse的安装和配置

--使用eclipse建立Java项目、编写和运行Java程序

--Java注释和Eclipse中的注释操作

--详解HelloWorld程序

-Java数据类型

--Java数据类型介绍

--Java整数类型

--Java浮点类型

--Java字符类型和布尔类型

--数据类型实战

--数据类型转换

--Java强制类型转换精度损失示例与表达式中的数据类型转换

-Java数组

--Java数组介绍、声明与使用

--一维数组的初始化与length属性

--数组索引的原理与使用

--二维数组的介绍与使用

-Java变量

--Java的变量

-命令行参数

--命令行参数的介绍

第二章 类与对象

-2.0-导学

--2.0-导学

-2.1-面向对象方法的特性

--2.1-面向对象方法的特性

--第二章 类与对象--2.1-面向对象方法的特性

-2.2-1-类声明与对象创建

--2.2-1-类声明与对象创建

--第二章 类与对象--2.2-1-类声明与对象创建

-2.2-2-数据成员

--2.2-2-数据成员

--第二章 类与对象--2.2-2-数据成员

-2.2-3-方法成员

--2.2-3-方法成员

--第二章 类与对象--2.2-3-方法成员

-2.2-4-包

--2.2-4-包

--第二章 类与对象--2.2-4-包

-2.2-5-类的访问权限控制

--2.2-5-类的访问权限控制

--第二章 类与对象--2.2-5-类的访问权限控制

-2.3-1-对象初始化

--2.3-1-对象初始化

--第二章 类与对象--2.3-1-对象初始化

-2.3-2-内存回收

--2.3-2-内存回收

--第二章 类与对象--2.3-2-内存回收

-2.4-枚举类

--2.4-枚举类

--第二章 类与对象--2.4-枚举类

-2.5-应用举例

--2.5-应用举例

-2.6-第2章小结

--2.6-第2章小结

-第二章编程练习题

-课件

--第二章课件

第三章 类的重用

-3.0-导学

--3.0-导学

-3.1.1-3.1.2-类继承的概念和语法

--3.1.1-3.1.2-类继承的概念和语法

--第三章 类的重用--3.1.1-3.1.2-类继承的概念和语法

-3.1.3-隐藏和覆盖

--3.1.3-隐藏和覆盖

--第三章 类的重用--3.1.3-隐藏和覆盖

-3.2-Object 类

--3.2-Object 类

--第三章 类的重用--3.2-Object 类

-3.3-终结类与终结方法

--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.1-5.1.2-异常处理的概念

-5.1.3-5.1.5-异常的处理

--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集合框架介绍

--Java集合框架介绍

--第六章 对象群体的组织--6.1-Java集合框架介绍

-6.2-主要接口及常用的实现类

--6.2-主要接口及常用的实现类

--第六章 对象群体的组织--6.2-主要接口及常用的实现类

-6.3-常用算法

--常用算法

-6.4-数组实用方法

--6.4-数组实用方法

-6.5-基于动态数组的类型(Vector, ArrayList)

--基于动态数组的类型(Vector, ArrayList)

-6.6-遍历Collection

--遍历Collection

-6.7-Map接口及其实现

--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.9-中间层容器(一)

-7.10-中间层容器(二)

--7.10-中间层容器(二)

-7.11-原子组件(一)

--7.11-原子组件(一)

-7.12-原子组件(二)

--7.12-原子组件(二)

-7.13-原子组件(三)

--7.13-原子组件(三)

-7.14-其它Swing特性

--7.14-其它Swing特性

-7.15-第7章小结

--7.15-第7章小结

-课件

--课件

类型转换笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。