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

请考虑以下代码段:

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规范 ,我们发现了

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

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

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

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

从4.12.4节 :

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

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

z1 不是最终变量(即使没有其他任何值赋值),因此它不是常量变量,因此不是常量表达式 – 因此您从规范中引用的段落不适用。