根据Wikipedia,空白的最终变量是一个最终变量,其声明在定义时缺少初始化器。
同时,switch case语句的值必须是编译时常量值。
根据以上两个肯定,我希望下面的两个代码片段都可以编译而没有任何问题,但只有第一个代码片段可以:
final int y = 1;
switch(1) {
case y:
}
和
final int y;
y = 1;
switch(1) {
case y:
}
在第二个示例中,Java编译器是否应该运行流分析,以确保分配空白的最终变量,从而编译代码而没有错误?
答案 0 :(得分:0)
开关案例需要一个常量表达式。在第一个示例中,编译器使用常量替换初始化,然后使用该常量代替所有y变量。在第二种情况下,编译器无法执行此操作。
答案 1 :(得分:0)
因此,您收到错误消息constant expression required
。从JLS 15.28开始:http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.28常量表达式可以是引用常量变量的简单名称。再次,来自JLS http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.12.4:
空白决赛是一个最终变量,其声明缺少初始值。
常量变量是基本类型或类型String的最终变量,使用常量表达式(第15.28节)进行初始化。变量是否是常量变量可能对类初始化(第12.4.1节),二进制兼容性(第13.1节,第13.4.9节)和明确赋值(第16节(定义赋值))有影响。
因此,在第一种情况下,y是一个常量变量,在第二种情况下,它是一个空白变量。这就是为什么你不能使用它的原因。