使用三元运算符和最终变量时出现意外输出

时间:2011-01-17 08:59:34

标签: java final ternary-operator

请考虑以下代码段:

public static void main(String[] args) {
    int z1 = 0;
    final int z2 = 0;
    System.out.println(false ? z1 : 'X');
    System.out.println(false ? z2 : 'X');
}

运行此代码时,我希望在您的控制台中看到两个X。但是,实际输出是:

  

88
  X

如果我们查看Java specifications regarding the ternary operator,我们就会发现

  

如果其中一个操作数是T类型,其中T是byte,short或char,另一个操作数是int类型的常量表达式,其值可以在类型T中表示,那么条件表达式的类型是T

因此,第一个输出会将'X'字符视为int,这就是它打印88的原因。

但是,我不确定为什么使用final会改变第二个输出的行为。

1 个答案:

答案 0 :(得分:9)

在第二种情况下,z2计为constant expression,因为它是int类型的最终变量。

来自section 4.12.4

  

我们调用一个原始类型或类型String的变量,它是final,并使用编译时常量表达式(第15.28节)初始化为常量变量。变量是否是常量变量可能对类初始化(第12.4.1节),二进制兼容性(第13.1节,第13.4.9节)和明确赋值(第16节)有影响。

Section 15.28在项目集中包含“常量变量”,可用于形成常量表达式。

z1 是一个最终变量(即使没有别的东西给它赋值)所以它不是一个常量变量,因此不是一个常量变量 - 所以你引用的段落从规范不适用。