它与编译器如何确定是否执行语句有关。它在JLS#16中定义:
每个局部变量和每个空白的final字段在对其值进行任何访问时都必须具有一个明确分配的值。
在您的情况下,编译器无法确定
y已被明确分配,并给您一个错误。这是因为它将需要确定条件始终为真,并且仅当中的条件
if为 常量表达式时 才有可能。
JLS#15.28定义
常量表达式 :
编译时常量表达式是表示原始类型或String的值的表达式,该值不会突然完成,并且仅使用以下内容组成:
- […]
- 引用常量变量(第4.12.4节)的简单名称(第6.6.5.6.1节)。
该JLS#4.12.4定义
常量变量 为:
最终类型并使用编译时常量表达式初始化的基本类型或String类型的变量称为常量变量。
在您的情况下,
final int x = 101;是一个常量变量,但
final int x; x = 101;不是。



