通过阅读Java核心技术卷一结合开发过程中遇到的关于运算过程中类型转换的问题,我进行以下分析,如有疑问或不当之处,欢迎读者在评论区留言。
类型转换规则
说明:下图来源于Java核心技术卷一第三章截图
个人理解:
图中给出的是在非强制类型转换下,各类型数据在运算过程中的自动化转换规则。比如一个short型数据和一个long型数据进行加法运算,那么short型数据会转化成long型数据,运算结果为long型数据,如果此处将运算结果赋予short型或者其他非long型及非浮点型变量,则会出现编译不通过现象。
示例代码
说明:此处仅以short-int-long-double举例,其他基本类型数据同理。
/**
* 功能 在运算过程中的类型转换-编译是否通过
**/
public class CastTypeInOperator {
public static void main(String[] args) {
short s = 1;
// 编译不通过--运算中的s先转为int型,加1结果为int型,而s为short型变量,出现类型不一致
//s = s + 1;
// 下述编译通过--运算中的s先转为int型,加1结果为int型,然后结果通过强制类型转换为short型,因s为short型变量,类型一致,编译通过
s = (short) (s + 1);
s += 1;
int i = 1;
// 下述编译通过--运算中的s先转为int型,加i结果为int型,因i为int型变量,类型一致,编译通过
i = i + s;
// 下述编译通过--运算中的s先转为int型,运算中虽然对i进行强制类型转换为short型,但参与运算中仍转换为int型,结果为int型,因i为int型变量,类型一致,编译通过
i = (short) i + s;
long l = 2;
// 编译不通过--运算中的i先转为long型,加l结果为long型,而i为int型变量,出现类型不一致
//i = i + l;
// 下述编译通过--运算中的s先转为long型,加l结果为long型,因l为long型变量,类型一致,编译通过
l = l + s;
// 下述编译通过--运算中的i先转为long型,加l结果为long型,因l为long型变量,类型一致,编译通过
l = l + i;
// 强制类型转换后,下述编译也通过
// 运算中对l进行强制类型转换为int型,结果为int型,因i为int型变量,类型一致,编译通过
i = i + (int) l;
// 运算中对l进行强制类型转换为short型,参与运算中连同s转换为int型,结果为int型,因i为int型变量,类型一致,编译通过
i = s + (short) l;
// 下述编译皆通过
// l转换为double型,d为double型,类型一致,编译通过
double d = l;
// s转换为long型,运算结果为long型,然后结果由long型转换为double型,d为double型,类型一致,编译通过
d = l + s;
System.out.printf("%d,%d,%d,%s", s, i, l, d);
}
}
代码分析:
详细分析见上述代码注释。下述以short型和int型为例,做简要总结。
结合Java核心技术卷一中关于类型转换的规则,short型和int型参与运算时,short型会转换为int型,然后结果为int型数据。注意:即使参与运算的两个数都为short型,其运算结果也不是short型,其结果的具体类型依据结果赋值的变量类型【如果赋值给short型变量,则结果为int型,此时需要进行强制类型转换,才可编译通过;如果赋值给int型变量或者long型变量或float型变量或double型变量,则结果对应为int型或者long型或float型或double型】。