在开关情况下不接受最终常数

时间:2014-05-05 13:01:22

标签: java switch-statement java-7 final

我想知道方法add()中的2个声明之间的区别,如下所示。

final int c;
c = 20;

final int c = 20;

我认为两者都是最终变量,我无法重新分配任何新值。以下是以不同方式处理上述声明的方法。

void add() {
        final int a = 30;
        final int b = 10;
        final int c;
        c = 20;

        switch (a) {
        case b + c:
            System.out.println("In case b+c");
            break;

        default:
            break;
        }

    }

上述方法根本没有编译,抱怨

  

需要常量表达式案例b + c

如果变量c在一行中声明并初始化,如final int c = 30;。有用。

5 个答案:

答案 0 :(得分:10)

JLS #4.12.4常量变量定义为(强调我的):

  

原始类型或类型String的变量,即最终 并使用编译时常量表达式 初始化,称为常量变量。< / p>

在您的情况下,final int c = 20;是常量变量,但final int c; c = 20;不是。

答案 1 :(得分:2)

Java编译器将final标识符替换为其值(如果已声明&amp;在单个(相同)语句中初始化,否则标识符保持不变,并在运行时由jvm初始化为blank final变量。您可以通过打开class文件来查看此信息。 switch语句允许final,但不允许将blank变量用作case值。

final int a = 20; // concrete final variable
switch(a){}
#=> gets changed by compiler as the following:--
switch(20){}

final int a; // blank final variable
a = 20;
switch(a){}
#=> compiler leave it for jvm to initialize 
switch(a){}

答案 2 :(得分:0)

当您正在初始化并单独声明它时,您会收到该错误,同时执行此操作

答案 3 :(得分:-1)

最终变量不能再次重新评估运行时,如果你想使用switch case你不能在case子句中做(b + c), 而不是这个,请使用这个,

void add() {
    final int a = 30;
    final int b = 10;
    final int c;
    c = 20;
    final int cmp=b+c;
    switch (a) {
    case cmp:
        System.out.println("In case b+c");
        break;
    default:
        break;
    }
}

现在这对你来说很好,

答案 4 :(得分:-2)

你必须在使用前初始化局部变量..