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

Rom*_*las 12 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');
}
Run Code Online (Sandbox Code Playgroud)

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

88
X.

如果我们看一下关于三元运算符Java规范,我们发现了

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

所以第一个输出将'X'char视为一个int,这就是它打印的原因88.

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

Jon*_*eet 9

在第二种情况下,z2计为常量表达式,因为它是类型的最终变量int.

4.12.4节:

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

第15.28节包括可用于形成常量表达式的项集合中的"常量变量".

z1不是最后的变量(尽管没有任何一个其他的值赋给它),所以它不是一个常数变量,因此不是一个常量表达式-让你从规范引述条款不适用.