在" 定义分配的Java语言规范"一章中,例16-2说明了这一点
Java编译器必须为代码生成编译时错误:
{ int k; int n = 5; if (n > 2) k = 3; System.out.println(k); /* k is not "definitely assigned" before this statement */ }即使n的值在编译时是已知的,并且原则上在编译时可以知道对k的赋值将始终被执行(更恰当地,被评估).Java编译器必须按照本节中规定的规则运行.规则只承认不变的表达; 在此示例中,表达式n> 2不是§15.28中定义的常量表达式.
但是,如果我们看看§15.28,那就说明了
关系运算符<,<=,>和> =
可以有助于持续表达.
表达式是否是n > 2
一个常量表达式?我们怎样才能确定这一点?
它说是因为n
不是一个恒定的表达.
常量表达式是表示基本类型的值的表达式,或者
String
不突然完成的表达式,仅使用以下内容组成:
[...]
引用常量变量的简单名称(第6.5.6.1节)(§4.12.4).
和
常量变量是使用常量表达式初始化
final
的基本类型或类型的变量String
(第15.28节).
n
不是final
,因此不是一个恒定的变量.因此,它不是一个恒定的表达.因此n < 2
不是一个恒定的表达.