为什么当最后一个int被分配给一个字节时没有错误



为什么时出现错误

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

相关内容

最新更新