文章目录
- 一:隐式转换
- 二:强制转换
- 三:java中常量优化机制
- 四:常量类型
一、隐式转换
所谓隐式转换,就是将数据类型中,取值范围小的数据,给取值范围大的类型数据赋值,可以直接赋值。
首先,看一段代码:
int a = 10;
double b = a;
int 类型占的是4个字节,而double类型占8个字节,所以a赋值给b就可以直接赋值。
但是,如果这里要输出这个变量b时,输出值是10.0,而不是10。当a赋值给b时,系统会自动进行转换,这里的转换我们看不到,所以为隐式转换。
可以简记为:小的赋值给大的,可以直接给。
以上是小的给大的,反过来,那么大的赋值给小的如何做呢?
这样做:小的数据类型会提升为大的之后,再进行运算。
例如:
int a = 10;
double b = 10.9;
double c = a + b;
这里a是int 类型,b是double类型,a + b ,首先将a 的int类型提升为double类型,再进行运算,结果为double类型,所以结果用一个doubel类型接收。
最后,特别注意一点,byte,short,char这三数据在运算时,不管是否有更高的数据类型,都会提升为int类型,然后再进行运算。
如果是两个byte类型的数据相加,可以先让其相加,再对相加的结果整体进行强转。
例如:
byte a = 3;
byte b = 4;
byte c = (byte)(a + b);
二、强制转换
所谓强制转换,表示把一个数据范围大的数值或者变量赋值给另一个表示数值范围小的变量。但是会有精度损失问题。
格式: 目标数据类型 变量名 = (目标数据类型)值或者变量
例如:
int a = 10;
byte b = (byte)a;
System.out.println(b);
如果不进行强制转换,会出现不兼容的类型错误。
再如:
int a = 10.9;
byte b = a;
System.out.println(b);
这里得到的结果是10,因为发生了精度损失问题,使得10后面的小数丢失。
三、java中常量优化机制
先看一段代码:
public class a{
public static void mian(String[] args){
byte d = 3 + 4;
}
}
由于java中的常量优化机制,再编译时,就会将3+4计算出的结果7,自动判断7是否在byte取值范围内:
如果在的话:编译通过
如果不在的话:编译失败