类型转换
—自动类型转换
自动类型转换又称为隐式转换,不需要源代码中的任何特殊语法,一般只允许发生在从小的值范围到大的值范围的类型的转换,转换后的数值大小不受影响。例如:
int i1 = 123;
double d1;
d1 = i1; //从int到double的隐式转换
在某些情况下,隐式转换可能会降低精度,例如:从long到float的转换。
Java隐式转换示意图(m表示可能会降低精度):
Java隐式转换表:
转换源 | 转换目标 | 转换源 | 转换目标 |
---|---|---|---|
byte | short、int、long、float、double、 | int | long、float、double |
short | int、long、float、double | long | float、double |
char | int、long、float、double | float | double |
- 不存在到char类型的隐式转换
—强制类型转换
强制类型转换又称为显式转换,使用(target-type)value将表达式强制转换为所需的数据类型。例如,在下面的代码段中,语句“int i1 = (int)d1;”将d1的值显式转换为整数,然后将该值赋给i1。
float f2 = 22.5; //编译错误:浮点型常量22.5默认为double类型,不存在从double到float的自动转换
float f2 = (float)22.5; //从double到float的强制转换
float f1 = 22.5f; //加后缀f,则常量22.5f为float类型
double d1 = 22.5; //声明双精度变量d1并赋值
int i1 = (int)d1; //从double到int的强制转换
显式转换可能会导致精度损失,也可能由于溢出而导致转换结果不正确。例如:
byte b1 = (byte)12.3; //结果:12,精度损失
byte b2 = (byte)128; //结果:-128,由于溢出从而导致转换结果不正确
Java显式转换如表所示:
转换源 | 转换目标 | 转换源 | 转换目标 |
---|---|---|---|
short | byte、char | long | byte、short、char、int |
char | byte、short | float | byte、short、char、int、long |
int | byte、short、char | double | byte、short、char、int、long、float |
显式转换示例:
public static void main(String[] args) {
double d1 = 225; //声明双精度变量d1并赋值
double d2 = Math.sqrt(d1); //求225的平方根
int i1 = (int)d2; //双精度变量d2的值显式转换为整型
short s1 = 65; //声明short类型变量s1并赋值
char c1 = (char)s1; //short类型变量s1的值显式转换为char类型
System.out.printf("d1 = %f,d2 = %f,i1 = %d,s1 = %d,c1 = %s\n",d1,d2,i1,s1,c1);
//float f0 = 127.45; //错误:129.45默认为double,不能自动转换为float
float f1 = 127.45f; //声明单精度变量f1并赋值
float f2 = (float)129.45; //声明单精度变量f1并赋值:从double到float的强制转换
byte b1 = (byte)f1; //从float到byte的强制转换。注:精度丢失
byte b2 = (byte)f2; //从float到byte的强制转换。注:转换结果不正确(溢出)
System.out.printf("f1 = %f,f2 = %f,b1 = %d,b2 = %d",f1,f2,b1,b2);
}
运行结果如下所示: