Java(十二)——Java的类型转换

本文详细介绍了Java中的基本类型转换,包括自动类型转换和强制类型转换的过程及注意事项,并讲解了引用类型转换以及如何使用instanceof运算符确保类型转换的安全性。

1.基本类型的类型转换

1.1 基本类型

Java的基本数据类型分为两大类:boolean类型和数值类型。而数值类型又分为整数类型和浮点类型,整数类型里面的字符类型也可被单独对待。因此常把Java里的基本数据类型分为4类,如下图:
这里写图片描述

1.2 自动类型转换

如果系统支持把某种基本类型的值直接赋给另一种基本类型的变量,则这种方式被称为自动类型转换。当把一个表数范围小的数值或变量直接赋给另一个表数范围大的变量时,系统将可以进行自动类型转换;否则就需要强制转换。

表数范围小的可以向表数范围大的进行自动类型转换,就如同有两瓶水,当把小瓶里的水倒入大瓶中时不会有任何问题。Java支持自动类型转换的类型如下图所示。
这里写图片描述
上图中箭头左边的数值类型可以自动类型转换为箭头右边的数值类型。

不仅如此,当把任何基本类型的值和字符串值进行连接运算时,基本类型的值将自动转换为字符串类型,虽然字符串类型不是基本类型,而是引用类型。因此,如果希望把基本类型的值转换为对应的字符串时,可以把基本类型的值和一个空字符串进行连接。

1.3 强制类型转换

如果希望把上图中箭头右边的类型转换为左边的类型,则必须进行强制类型转换,强制类型转换的语法格式是:(targetType)value;当进行强制类型转换时,类似于把一个大瓶子里的水倒入一个小瓶子,如果大瓶子里的水不多还好,但如果大瓶子里的水很多,将会引起溢出,从而造成数据丢失。这种转换也被称为“缩小转换(Narrow Conversion)”。

1.4 表达式类型的自动提升

当一个算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升。Java定义了如下的自动提升规则。

  • 所有的byte类型、short类型和char类型将被提升到int类型。
  • 整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。曹组偶数的等级排序如上图——自动类型转换图所示,位于箭头右边类型的等级高于位于箭头左边类型的等级。

2. 引用变量的强制类型转换

编写Java程序时,引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法,即时它实际所引用的对象确实包含该方法。如果需要让这个引用变量调用它运行时类型的方法, 则必须把它强制转换成UN形式类型,强制类型转换需要借助于类型转换运算符。
前面介绍过,类型转换语法格式(targetType)value;这种强制类型转换不是万能的,当进行强制类型转换时需要注意:

  • 基本类型之间的转换只能在数值类型之间进行,这里所说的数值类型包括整数型、字符型和浮点型。但数值类型和布尔类型之间不能进行类型转换。
  • 引用类型之间的转换只能在具有继承关系的两个类型之间进行,如果是两个没有任何继承关系的类型,则无法进行类型转换,否则编译时就会出现错误。如果试图把一个父类实例转换成子类类型,则这个对象必须实际上是子类实例才行(即编译时类型为父类类型,而运行时类型为子类类型),否则将在运行时引发ClassCastException异常。

3. instanceof运算符

考虑到进行强制类型转换时可能出现异常,因此进行类型转换之前应先通过instancof运算符来判断是否可以成功转换,从而避免出现ClassCastException异常,这样可以保证程序更加健壮。
用法
instanceof运算符的前一个操作数通常是一个引用类型变量,后一个操作数通常是一个类(也可以是接口),它用于判断前面的对象是否是后面的类,或者其子类、实现类的实例。如果是,则返回true,否则返回false。

在使用instanceof运算符时需要注意:instanceof运算符前面操作数的编译时类型要么与后面的类相同,要么与后面的类具有父子继承关系,否则会引起编译错误。

Object obj = "Hello";
// obj变量的编译时类型为Object,Object与String存在继承关系,可以强制类型转换
// 而obj变量的实际类型是String,所以运行时也可以通过
String objStr = (String)obj;

Object objPri = new Integer(5);
// objPri变量的编译时类型为Object,objPri的运行时类型为Integer
// Ojbect与Integer存在继承关系
// 可以强制类型转换,而objPri变量的实际类型是Integer
// 所以下面代码运行时引发ClassCastException异常
// String str = (String)objPri;

// 使用instanceof运算符让程序更健壮
if(objPri instanceof String)
{
	String str = (String)objPri;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值