java扩展最终变量

sou*_*ung 3 java primitive operation

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

这是说,所有的byteshortchar值会自动扩大到int作为操作数的算术运算时。这是完美的逻辑。但是当我们将这个操作数设为 final 时就会出现混乱。

此代码不会编译(逻辑)

 short s1 = 10 ;
 short s2 = 20 ;
 short sum = s1 + s2;
Run Code Online (Sandbox Code Playgroud)

但是这个会编译

  final short s1 = 10 ;
  final short s2 = 20 ;
  short sum = s1 + s2; 
Run Code Online (Sandbox Code Playgroud)

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

JB *_*zet 6

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

short sum = 30; 
Run Code Online (Sandbox Code Playgroud)

因此,编译器能够知道分配给的值sum小到足以放入一个 short 中,从而进行编译。