为什么Java语言规范说表达式(n> 2)不是常量表达式?

时间:2016-01-07 16:36:06

标签: java

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是否为常量表达式?我们怎样才能确定这个?

2 个答案:

答案 0 :(得分:11)

它是这样说的,因为n不是constant expression

  

常量表达式是表示基元值的表达式   键入或突然完成的String并使用   只有以下内容:

     

  

常量变量是基本类型或类型的final变量   String用常量表达式初始化(​​§15.28)。

n不是final,因此不是常量变量。因此,它不是一个恒定的表达。因此n < 2不是一个常数表达式。

答案 1 :(得分:1)

你误读了规范的§15.28。该部分列出了常量表达式中允许的语言元素。如果表达式在列表中有任何,那么它不是常量表达式。它确实意味着(因为你显然认为它意味着)如果列表中的任何元素存在,则表达式是常量。

从语言规范(强调添加):

  

常量表达式是一个表达原始类型值的表达式,或者是String的一个表达式,它不会突然完成,并且仅使用 组成:<登记/>   ......等等。

表达式n > 2不是常量表达式,因为n未声明为final,因此n不是常量。尽管它在代码中的那个值只能是5,但它不符合常量的语言定义。 (参见§15.28引用的§4.12.4。)