最终变量和编译时常量之间的差异

Tar*_*das 26 java compile-time-constant

最终变量和编译时常量之间有什么区别?

请考虑以下代码

final int a = 5;
final int b;
b=6;
int x=0;
switch(x)
{
     case a: //no error
     case b: //compiler error
}
Run Code Online (Sandbox Code Playgroud)

这是什么意思?何时以及如何为最终变量赋值?运行时会发生什么以及编译时会发生什么?我们为什么要给switch一个编译时常量?java的其他结构需要编译时间常量?

poi*_*oae 27

问题是,所有case:语句在编译时必须是最终的.你的第一个陈述是终极的.a100%将是没有其他价值的5.

final int a = 5;
Run Code Online (Sandbox Code Playgroud)

然而,这不能保证b.如果有一个if语句b怎么办?

final int b;
if(something())
   b=6;
else
   b=5;
Run Code Online (Sandbox Code Playgroud)


Ste*_*n C 7

这是什么意思?

这意味着'b'不是编译时常量表达式,而JLS要求它.

何时以及如何为最终变量赋值?

正式地,当执行赋值语句或初始化程序时.

但实际上,如果final声明了编译时常量,则表达式在编译时进行计算,并将其值硬连接到代码中.

运行时会发生什么以及编译时会发生什么?

往上看.

我们为什么要给switch一个编译时常量?

因为JLS 需要它.

字节码编译器必须检查switch语句是否格式正确; 即开关常数的值不会发生碰撞.它还允许JIT编译器生成针对开关常量的实际值进行优化的代码.

java的其他结构需要编译时间常量?

没有我能想到的,在我的头脑中.