JLS(第5.2节)具有使用
常量表达式 进行赋值转换的特殊规则:
此外,如果表达式是一个常量表达式(§15.28类型的)
byte,short,char,或int:
- 如果变量的类型是
byte,short或char,并且常量表达式的值在变量的类型中可表示,则可以使用变窄的原始转换。
如果我们点击上面的链接,我们将在 常量表达式 的定义中看到这些:
- 基本类型的文字和类型的文字
String- 加法运算符
+和-
*引用常量变量(第4.2.4节)的简单名称(第6.5.6.1
节)。
如果我们点击上面的第二个链接,我们会看到
原始类型或类型的变量
String,即final,用一个编译时间常量表达式(初始化§15.28),被称为
恒定变量 。
因此,
foo + foo只能将其赋给
fooFooif
foo是一个 常量变量 。要将其应用于您的案例:
byte foo = 1;
没有 定义 常量变量, 因为不是final
。final byte foo = 1;
确实 定义了一个 常量变量 ,因为它是final
用 常量表达式 (原始文字)初始化的。final byte foo = fooArray[0];
没有 定义 常量变量, 因为它没有使用 常量表达式 初始化。
请注意,是否
fooFoo本身
final并不重要。



