java 扩大最终变量

java widening final variable

我正在阅读 java OCA 认证文档。 一些原始的操作行为对我来说似乎很奇怪。

据说所有byteshortchar值在用作算术运算的操作数时会自动扩大到int。这是完全合乎逻辑的。但是当我们将这个操作数设为 final 时,混乱就来了。

此代码无法编译(逻辑)

 short s1 = 10 ;
 short s2 = 20 ;
 short sum = s1 + s2;

但是这个可以编译

  final short s1 = 10 ;
  final short s2 = 20 ;
  short sum = s1 + s2; 

为什么会编译成功?关键字 final 的什么 属性 使这段代码编译通过?

它使 s1 和 s2 成为编译时常量表达式,因此加法是由编译器完成的,而不是在运行时完成的,因此代码等同于

short sum = 30; 

编译器因此能够知道分配给 sum 的值足够小以适合一个 short,因此它可以编译。