目录
Java程序中要求参与的计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换
一、什么时候数据类型会发生自动转换现象?
这里有2个不同数据类型的变量 A 和 B, 他们两个要参数数学运算,那么小类型会自动提升为大类型
(自动转换 :将取值范围小的类型 自动提升为 取值范围大的类)
转换规则:范围小的类型向范围大的类型提升, byte 、short、char 运算时直接提升为 int
二、什么时候发生强转现象?
当等号左边取值范围小,等号右边取值范围大的时候,需要进行强转才能进行数学运算
eg: int i = 1.5;
这是 错误,会产生编译失败,1.5是double类型,double取值范围 > int ;
想要赋值成功,只有通过强制类型转换,将 double 类型强制转换成 int 类型才能赋值。int i = (int)1.5;
强转引发的问题:
浮点转成整数,直接取消小数点,可能造成数据损失精度。
int 强制转成 short 砍掉2个字节,可能造成数据丢失。
public static void main(String[] args) {
// 定义s为short范围内最大值
short s = 32767;
// 运算后,强制转换,砍掉2个字节后会出现不确定的结果
s = (short) (s + 10);
System.out.println(s); // -32759
}
三、 下面代码存在编译问题为什么
public static void main(String[] args) {
byte b1 = 1, b2 = 2, b3, b6, b8;
final byte b4 = 4, b5 = 6, b7;
b3 = b1 + b2;
b6 = b4 + b5;
b8 = b1 + b4;
b7 = b2 + b5;
System.out.println(b3 + b6);
}
分析:
1、b3 = b1 + b2;
b1 和b2都是byte类型 且没有被final修饰,所以在参与运算的过程中都会转换成int类型的变量,而b3是byte类型,
所以会编译出错,正确的写法是b3 =(byte) (b1 + b2)
2、b6 = b4 + b5; b4,b5虽然都是byte类型,但是他们被final修饰了,所以参与运算时不会改变数据类型,
因此b4+b5=b6是可以通过编译,也可以进行计算的
3、b8 = b1 + b4;
b1为btye类型没有被final修饰,b4为btye类型被final修饰,他们在参与运算时转为int类型,而b8是byte类型
所以会编译出错,正确的写法是 b8 = (byte)(b1 + b4);
4、b7 = b2 + b5; 同上,
5、System.out.println(b3 + b6); 结果为13
四、 java中基本数据类型参与运算的规则
1、如果两个操作数中有一个是double类型的,另一个将会被转换成double类型,并且结果也是double类型
2、如果两个操作数中有一个是float类型的,另一个将会被转换为float类型,并且结果也是float类型
3、如果两个操作数中有一个是long类型的,另一个将会被转换成long类型,并且结果也是long类型
4、否则(操作数为:byte、short、int 、char),两个数都会被转换成int类型,并且结果也是int类型。
被final修饰的基本数据类型在参与运算时,不会做类型改变
final是java中的一个关键字,可以用来修饰类,方法,成员变量和本地变量,如果用final修饰引用,那么这个引用将不能被改变.
使用final修饰变量,则这个变量只是可读不可写的.