切换语句,包含空白最终变量

时间:2017-03-06 14:16:56

标签: java

根据Wikipedia,空白的最终变量是一个最终变量,其声明在定义时缺少初始化器。

同时,switch case语句的值必须是编译时常量值。

根据以上两个肯定,我希望下面的两个代码片段都可以编译而没有任何问题,但只有第一个代码片段可以:

    final int y = 1;

    switch(1) {
        case y:
    }

    final int y;
    y = 1;
    switch(1) {
        case y:
    }

在第二个示例中,Java编译器是否应该运行流分析,以确保分配空白的最终变量,从而编译代码而没有错误?

2 个答案:

答案 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是一个常量变量,在第二种情况下,它是一个空白变量。这就是为什么你不能使用它的原因。