隐式类型转换
Java语言是强类型语言,变量的数据类型被指定后,会一直保持该数据类型。同时Java语言对参与赋值运算和算术运算的操作数数据类型要求必须一致,当参与运算的操作数数据类型不一致时,就需要对操作数的数据类型进行类型转换,把参与运算的操作数转换为同一数据类型后,再进行运算。
例如:
double PI = 3.14;
int radius = 5;
double s;
s = PI * radius * radius;
在上面的例句中,表达式PI * radius * radius有二个操作数,PI是double类型,radius是整数类型。因为操作数的数据类型不一致,Java编译器会对数据类型做强制转换,将radius的整数类型强制转换为double类型。
这种转换是Java编译器自动进行的,程序员不需要进行任何操作,由Java编译器自动完成,这种类型的转换也称为隐式转换。
由于不同的数据类型存储空间和表示的数值精度是不同的,因此在数据类型的转换过程中,就会存在数值精度丢失和数值溢出的问题。例如:double类型转换为float类型,数值精度就会丢失;long类型转换为int类型时,如果long类型变量存储的数值超过了int类型能够存储的数值范围,就会发生数值溢出。
为了避免在转换过程中发生数值精度丢失和溢出的问题,隐式转换都会遵循从低级数据类型到高级类型的转换规则,也可以说是从数值存储精度小的类型到存储数值精度高的类型转换。这些数据类型按数值存储范围大小依次为:
byte->short->int->long->float->double
下表列出了数据类型隐式转换的一般规则:
案例1:声明不同类型的变量,进行各变量间的算术运算,考查运算过程中的类型的隐式转换。代码如下:
/**
* @Title: DataTypeChangeSample.java
* @Package unit
* @Description: Java基础知识课程案例
* @author 编程训练营
* @date 2019年12月2日
* @version V1.0
*/
package unit;
/**
* @ClassName: DataTypeChangeSample
* @Description:数据类型转换(隐式转换)案例1
* @author 编程训练营
* @date 2019年12月2日
*
*/
public class DataTypeChangeSample {
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
// 声明byte类型的变量,并初始化为byte所表示的最大值
byte tempByte = 65;
// 声明int类型的变量
int tempInt = 34;
// 声明float类型的变量
float tempFloat = 29.6f;
// 声明double类型的变量
double tempDouble = 86.69;
System.out.println("byte类型的数据与float类型的进行相加运算,运算结果为:" + (tempByte+tempFloat));
System.out.println("float类型的数据与double类型的进行相加运算,运算结果为:" + (tempFloat+tempDouble));
System.out.println("byte类型的数据与int类型的进行相加运算,运算结果为:" + (tempByte+tempInt));
}
}
显示类型转换
显示类型转换是相对隐式转换来说的,隐式转换由Java编译器自动进行,不需要程序员做任何操作。显示类型转换需要程序员在代码中对数据类型进行显示类型转换。
当进行数据类型的显示转换时,程序员需要自身判断类型转换过程中是否会发生数值溢出或精度丢失,当由精度高的类型转换为精度低的类型时,会发生精度丢失。
显示转换的语法如下:
(类型名)要转换的变量或常量
例如:
// 将数值36.9强制转换为int,精度丢失
int tempInt = (int)36.9;
// 声明double类型的变量
double tempDouble = 12.15;
// 将double类型强制转换为int,精度丢失
tempInt = (int)tempDouble;
在上面的例句中,36.9是数值常量,默认为double类型,显示转换为int类型并赋值给tempInt,此时tempInt的值为36,精度丢失。
tempDouble是double类型的变量,将tempDouble的值赋值给int变量时,需要进行显示转换,int变量只存储double变量的整数部分,小数部分丢失。
除boolean类型外,其它基本类型之间的转换都可以使用显示转换来实现。