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

ali*_*lia 6 java

为什么我什么时候会收到错误

       int i=123;
       byte b=i;
Run Code Online (Sandbox Code Playgroud)

但不是在这种情况下

      final int i=123;
      byte b=i;
Run Code Online (Sandbox Code Playgroud)

Tii*_*iJ7 6

final使用常量表达式初始化变量时,它将成为编译时常量.本质上,在编译代码时,它只会在添加变量的任何位置对该值进行硬编码.你可以在字节码中看到这个:

 0  bipush 123
 2  istore_1 [i]
 3  bipush 123
 5  istore_2 [b]
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它将值123直接推送到byte(相同byte b = 123),这是a的有效值byte.它不适用于超出允许的字节范围的值.

如果变量不是final(或未使用常量表达式初始化),则编译器会将其视为普通变量,并应用常规分配规则.意味着要将int分配给一个字节需要进行转换:

int i = 123;
byte b = (byte) i;
Run Code Online (Sandbox Code Playgroud)

哪个产生这个字节码:

0  bipush 123
2  istore_1 [i]
3  iload_1 [i]
4  i2b
5  istore_2 [b]
Run Code Online (Sandbox Code Playgroud)