在程序运行的过程中,经常需要将一种数值类型转换成另一种数值类型,这种转换就叫做数据类型的转化。Java的数据类转化分为三种:自动转换,强制转换,类类型的相互转换。下面将一个一个的介绍:
一、自动转换
在程序运行的时候,有些数据类型的转化由编译器自动完成,而不需要人为的转换,这种转换为自动转换。
自动转换存在的前提:小范围的数值类型和大范围的数值类型进行运算的时候,小范围的数据的类型会自动的提升转换为大范围数据类型。因此自动转换存在条件是小范围类型到大范围类型的转换。
- 几个要点
- 自动转换只限于数值类型
- 自动转换是小类型自动转为大类型
- 如果两个操作数中存在一个double类型值,那么另一个操作数就会转为double型
- 如果两个操作数中存在一个float类型值,那么另一个操作数就会转为float型
- 如果两个操作数中存在一个long类型值,那么另一个操作数就会转为long型
- 否则就转为int类型。
- 数值转换的合法转换图
- 自动转换内存示意图解
说明:图中a为int型,b为byte型,当分配内存的时候,系统为a分配4个字节空间共32位,为b分配一个字节空间,共8位。当a+b时,b的类型为小范围,那么b的类型就会自动提升为int型
二、强制转换
从上面知道,自动转换是小范围类型转成大范围类型,因此由大范围数据转成小范围数据就是强制转换,为什么叫强制转换,是因为这种情况不会自动进行转换,而是需要进行强制转换。因为由大范围转成小范围可能将大范围数据截断,导致数据溢出,因此使用强制转换要注意。如下图示:
- 特点:从上图中可以看出,强制转换可能会导致丢失一些数据
- 转换格式:小数据类型 变量名 = (小数据类型) 大数据类型的数据变量;
- 如果试图将一个数值从一种类型强制转换为另一种类型,而又超出了目标类型的表示范围的话,结果就会截成一个完全不同的值。
- 强制转换内存图解:
三、类类型转换
Java语言的类类型也是可以像话转换的。它有如下的几个方面:
- 子类对象可以直接转换成父类对象(多态)
- 父类对象也可以转成子类对象,要强制转换
- 接口对象也同上面两条一样
- String类型和Integer,Double,Float,Boolean等基本包装类之间也可以通过Java提供的方法进行转换(具体查看jdk-help)
- 基本数据类型和基本类型包装类之间的相互转换,拆装箱操作
- 基本数据类型 ---- > 包装类类型 : 装箱操作
- 包装类类型 ---- > 基本数据类型 : 拆箱操作