为什么时出现错误
int i=123;
byte b=i;
但在这种情况下不是
final int i=123;
byte b=i;
使用常量表达式初始化final
变量时,它将成为编译时常量。本质上,当代码被编译时,它只会对添加变量的所有地方的值进行硬编码。你可以在字节码中看到这一点:
0 bipush 123
2 istore_1 [i]
3 bipush 123
5 istore_2 [b]
正如您所看到的,它将值123
直接推送到byte
中(与byte b = 123
相同(,这是byte
的有效值。对于超出字节允许范围的值,它将不起作用。
如果变量不是final
(或者没有用常量表达式初始化(,则编译器会将其视为正常变量,并应用正常的赋值规则。这意味着要将int分配给一个字节,需要对其进行强制转换:
int i = 123;
byte b = (byte) i;
产生这个字节码的:
0 bipush 123
2 istore_1 [i]
3 iload_1 [i]
4 i2b
5 istore_2 [b]
布尔值、byte、short、int、long默认情况下都是int,都是int并且可以赋值,只要它们不超过的值范围
final修改的变量是在编译时确定的,不能更改。
final修改的变量不会自动更改类型
final int i = 127;
byte b = i;
final int i = 128;
byte b = i; // There will be compilation errors