为什么我什么时候会收到错误
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)
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)
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |