【发布时间】:2021-06-16 18:57:58
【问题描述】:
byte b1 = 3 + 5;
文字3、5 和3 + 5 的类型为int。
上面的表达式有效是因为 Java 在内部将 3 + 5 的结果从 int 转换为 byte,或者?
对于b2,同样的解释应该是有效的:
byte b1 = 3 + 5;
byte b2 = b1 + 5; // Type mismatch: cannot convert from int to byte
但事实并非如此。
为什么?
【问题讨论】:
-
区别:
3和5是编译时常量,所以3 + 5可以在编译时求值,整行简化为byte b1 = 8;。但是b1不是编译时间常数,所以这不适用于byte b2 = b1 + 5;行。 -
观看此对话,也许它可以帮助stackoverflow.com/questions/9581530/…
-
如果您声明 b1
final,则第二次对话有效。编译器只是考虑非最终变量可能已被第二行更改的可能性,因此太大以适合另一个字节 -
+的操作数经过二进制数值提升:在第二种情况下,它实际上是(int) b1 + 5,其结果是一个非编译时常量int。在第一种情况下,两个操作数都是编译时常量(和整数),因此结果是编译时常量 int;编译器可以检查结果是否在byte的范围内,因此可以隐式缩小结果。
标签: java