为什么在
时出现错误 int i=123;
byte b=i;
但在这种情况下不是
final int i=123;
byte b=i;
答案 0 :(得分:6)
使用常量表达式初始化final
变量时,它将变为compile-time constant。本质上,在编译代码时,它只会对添加变量的位置进行硬编码。您可以在字节码中看到这一点:
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]
答案 1 :(得分:-1)
默认情况下,布尔值,字节,短整数,整数,长整数均为整数,并且均为整数,并且只要不超出其值范围,就可以进行分配
由final修改的变量是在编译时确定的,不能更改。
由final修改的变量不会自动更改类型
final int i = 127;
byte b = i;
final int i = 128;
byte b = i; // There will be compilation errors