1 数据类型转换相关细节:
- 凡是byte short char类型的数据在运算过程中都会自动转化成int类型的数据进行运算。 如:byte a = 1; byte b = 2; byte c = a+b; 会报错 如:System.out.println('a'+1);输出结果为98
- 两个不同数据类型的数据运算时,结果的数据类型取决于大的那个数据的类型。 如:int a = 1; long b = 2L; int sum = a + b;也会报错。 如:System.out.println('a'+1);输出结果为98
- byte b = 3;b += 2; 此处 b += 2; 等于 b = b + 2;但是在此处却不会报错,因为该复合运算底层有一个强制类型转换(b++;也不会报错的原因也是底层有一个强制类型转换)
2 一个整数在默认情况下为整型,但看到下面几句代码,是否会有一些疑问呢?
int i = 5; byte b = i;编译时会出现报错的情况,
但 byte b = 5; 编译时却没有问题。
既然5默认是一个整型,而i也是一个整型,那究竟是为什么只有上面的代码报错而下面的代码却没有报错呢?原因其实是:java编译器在编译时能够读取一个常量的值,而却不能读取一个变量的值。在byte b = 5;这里5是一个常量,编译器能够读取到其值,检测到其值能够被byte类型存下是则能通过编译,而byte b = i;时此时i是一个变量,编译器只能检测到它是一个int类型的值而不会知道值具体是多少(在这我们还应知道变量在编译时其实是不会开辟内存空间的,只有在java虚拟机运行到该语句时才会开辟内存空间存储那个值),就会在编译时报错显示精度可能会丢失。
3 算术运算符中要注意的例子:
int i = 0;i = i++; System.out.println(i);输出结果为0。
要知道此题答案需要知道jvm虚拟机的后自增原理。i++;这一句在jvm虚拟机中会先创建一个临时变量,int temp = i; 然后再i = i +1;最后如果有赋值语句时再把temp给出去这里则是 i = temp; 虽然这波操作看起来有点奇怪,但是其实这才符合算术运算符的优先顺序,而以往刚开始学习说的先使用后++反而有点问题,因为++的优先级是高于=的,如果按大多数的地方理解后++就是先使用后++的话 这里就不太符合优先级了。
同理,后置--也会有同样的现象。
4 复合赋值运算符需注意:
byte b = 1; b = b+1;则会报错 而 byte b = 1; b += 1;则是不会报错的,因为java编译器会自动强制类型转换
其他复合赋值运算符也有相同现象。
5 复合赋值运算符需注意:
byte b = 1; b = b+1;则会报错 而 byte b = 1; b += 1;则是不会报错的,因为java编译器会自动强制类型转换
其他复合赋值运算符也有相同现象。