问题来源
byte var = 10 + 20; // 10 + 20 值为int类型,却能赋值给 byte
byte var = 10;
final byte constant = 10;
byte var1 = var + 20; // 存在变量,编译报错
byte var2 = constant+ 20; // 编译通过
int var = 10;
final int constant = 10;
byte var1 = var + 20; // 存在变量,编译报错
byte var2 = constant+ 20; // 编译通过
问题描述
某些场景下,取值范围大的数据类型(int)可以直接赋值给取值范围小的(byte、shor、char)。
问题答案
- 常量优化机制
- 先判断值是否是常量, 然后再看值是否在该数据类型的取值范围内.
final int constant = 126; byte var = constant + 2; // 编译出错,128超出byte的取值范围
- 只有byte, short, char 可以使用常量优化机制, 转换成int类型
- 先判断值是否是常量, 然后再看值是否在该数据类型的取值范围内.
拓展
short var = 10;
var = var + 20; // 编译报错,运算中存在变量
var += 20; // 等效于: var = (short) (s + 20); 没有走常量优化机制,而是进行了类型转换