请考虑以下代码段:
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
会改变第二个输出的行为。
答案 0 :(得分:9)
在第二种情况下,z2
计为constant expression,因为它是int
类型的最终变量。
我们调用一个原始类型或类型String的变量,它是final,并使用编译时常量表达式(第15.28节)初始化为常量变量。变量是否是常量变量可能对类初始化(第12.4.1节),二进制兼容性(第13.1节,第13.4.9节)和明确赋值(第16节)有影响。
Section 15.28在项目集中包含“常量变量”,可用于形成常量表达式。
z1
不是一个最终变量(即使没有别的东西给它赋值)所以它不是一个常量变量,因此不是一个常量变量 - 所以你引用的段落从规范不适用。