为什么Java语言规范说表达式(n>;2)不是常量表达式?
在关于Java语言规范的一章中 Java编译器必须为代码生成编译时错误:为什么Java语言规范说表达式(n>;2)不是常量表达式?,java,Java,在关于Java语言规范的一章中 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的赋值
{
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
不是一个
常量表达式是表示基元值的表达式
键入或键入一个字符串
,该字符串不会突然完成,并使用
只有以下几点:
- [……]
- 引用的简单名称(§6.5.6.1)
最终
变量
用常量表达式(§15.28)初始化的字符串
n
不是final
,因此不是常量变量。因此,它不是一个常量表达式。因此,n<2
不是一个常量表达式。您误读了规范的§15.28。该节列出了常量表达式中允许的语言元素。如果表达式在列表中有任何而不是,则它不是一个常量表达式。它并不意味着如果列表中有任何元素存在,那么表达式是常量
从语言规范(添加了强调):
常量表达式是表示原语类型的值或不突然完成的字符串的表达式,仅使用以下内容组成:
... 等等
表达式n>2
不是常量表达式,因为n
未声明final
,因此n
不是常量。即使它在代码中该点的值只能是5,也不符合常量的语言定义。(参见第15.28节引用的内容)。是否为常量表达式?不,所以,局部变量名不是常量变量,我错过了简单名称部分。现在我明白了,thx Sotirios@不,你误解了。问题不在于名称,而是变量不是final
。因此,任何非final的变量都不是常量变量,对吗?@reinardhz如果它不是final
,就不能是常量变量。但是还有其他规则来决定一个变量是否是常数变量。这些在JLS链接章节中列出。