在Definite Assignment上的Java语言规范一章中,Example 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
不是constant expression。
常数表达式是表示原始值的表达式
类型或String
不会突然完成并且由以下内容组成
仅以下内容:
[...]
引用constant variables (§4.12.4)的简单名称(§6.5.6.1)。
和
常量变量是基本类型或类型的final
变量
用常量表达式(第15.28节)初始化的String
。n
不是final
,因此不是常量。因此,它不是一个常量表达式。因此n < 2
不是常数表达式。