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

时间:2018-08-01 07:01:53

标签: java

为什么在

时出现错误
       int i=123;
       byte b=i;

但在这种情况下不是

      final int i=123;
      byte b=i;

2 个答案:

答案 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