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

2022-09-01 14:20:49

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

请考虑以下代码

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

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


答案 1

问题是,所有情况:语句在编译时必须是最终的。你的第一个陈述是终极的。 对于 100% 除 .a5

final int a = 5;

但是,对于 不能保证这一点。如果周围有一个if语句呢?bb

final int b;
if(something())
   b=6;
else
   b=5;

答案 2

这是什么意思?

这意味着“b”不是编译时常量表达式,JLS要求它是编译时常量表达式。

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

正式地说,当执行赋值语句或初始值设定项时。

但在实践中,如果声明编译时常量,则在编译时计算表达式,并且其值将硬连接到代码中。final

运行时会发生什么,编译时会发生什么?

见上文。

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

因为 JLS 需要它。

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

Java的哪些其他结构需要编译时常数?

没有我能想到的,在我的头顶上。


推荐