java为什么添加最终字节会生成字节,而添加非最终字节会生成int?
byte b1=1,b2=2,b3,b6;
final byte b4=4,b5=6;
b6=b4+b5; // line3
b3=b1+b2; // line4: error: incompatible types: possible lossy conversion from int to byte
System.out.println(b3+b6);
为什么第三行是对的?似乎类型不正确,我应该得到我在第4行得到的错误
# 1 楼答案
您的问题不是最终问题,要消除错误,请执行以下操作:
对前面定义的最终变量的一次性赋值本身就是一个有效语句
第3行-编译器只需将您的值作为整型常量内联
第4行-编译器不能这样做
接下来读: http://www.javatpoint.com/final-keyword
# 2 楼答案
错误发生在第4行而不是第3行,因为编译器知道
final
变量的值,但不知道非final
变量的值。编译器会看到final
,并且在使用常量值之前,该变量已被明确赋值,并且由于该变量是final
,因此该值无法更改。因为编译器知道这些值,所以它知道在值10的转换中没有损失(b4+b5
)。事实上,它们实际上是常量,你正在做b6=10
——如果你看一下如果我们删除第4行并调整第6行所生成的字节码,我们会发现这正是编译器所做的:完全优化b4
和b5
如果您为
b4
和b5
(100
)选择了不同的值,那么第3行也会出现错误:Live on ideone
这里有一些东西可以证明这一点
下面是拆解:
注意
。。。它将文本值10存储在
b6