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

Java 使用三元运算符和最终变量时出现意外输出,java,final,ternary-operator,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 如果我们看一下,我们发现 如果其中一个操作数为T类型,其中T为字节、短字符或

考虑以下代码片段:

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

如果我们看一下,我们发现

如果其中一个操作数为T类型,其中T为字节、短字符或字符,而另一个操作数为int类型的常量表达式,其值可在T类型中表示,则条件表达式的类型为T

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


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

在第二种情况下,
z2
算作a,因为它是
int
类型的最终变量

发件人:

我们将原语类型或字符串类型的变量称为常量变量,该变量是最终变量,并用编译时常量表达式(§15.28)初始化。变量是否为常量变量可能涉及到类初始化(§12.4.1)、二进制兼容性(§13.1,§13.4.9)和确定赋值(§16)

在可用于形成常量表达式的项集中包含“常量变量”


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

只是作为旁点,这是我今天第二次看到有人有效地假设他们期望看到的是其他人期望看到的。我认为更恰当的说法是,“当运行此代码时,我希望看到……”Jon,你是对的。问题编辑。