12

考虑这个代码片段:

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'char 视为一个int,这就是它打印的原因88

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

4

1 回答 1

9

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

第 4.12.4 节开始:

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

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

z1不是最终变量(即使没有其他任何东西为其赋值)所以它不是一个常量变量,因此不是一个常量表达式 - 所以你从规范中引用的段落不适用

于 2011-01-17T09:10:35.053 回答