我想知道方法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;
。有用。
答案 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)
你必须在使用前初始化局部变量..