在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
是否为常量表达式?我们怎样才能确定这个?
答案 0 :(得分:11)
它是这样说的,因为n
不是constant expression。
常量表达式是表示基元值的表达式 键入或突然完成的
String
并使用 只有以下内容:
- [...]
- 引用constant variables (§4.12.4)。
的简单名称(第6.5.6.1节)
和
常量变量是基本类型或类型的
final
变量String
用常量表达式初始化(§15.28)。
n
不是final
,因此不是常量变量。因此,它不是一个恒定的表达。因此n < 2
不是一个常数表达式。
答案 1 :(得分:1)
你误读了规范的§15.28。该部分列出了常量表达式中允许的语言元素。如果表达式在列表中有任何不,那么它不是常量表达式。它确实不意味着(因为你显然认为它意味着)如果列表中的任何元素存在,则表达式是常量。
从语言规范(强调添加):
常量表达式是一个表达原始类型值的表达式,或者是
String
的一个表达式,它不会突然完成,并且仅使用 组成:<登记/> ......等等。
表达式n > 2
不是常量表达式,因为n
未声明为final
,因此n
不是常量。尽管它在代码中的那个值只能是5,但它不符合常量的语言定义。 (参见§15.28引用的§4.12.4。)