short s = 20;
这里其实是2个动作
1) short s; 声明了一个变量s,类型为short
2) 声明的同时完成了初始化, 初始化的值为20
所以这种情况下,下面的20被Java的编译器尝试与左边的s进行绑定,发现是范围内的数字,就绑定成功。
而下面这种情况就会是编译错误
int a = 20;
short s = a; 提示你把一个int转换成short,注意这里int并未声明为final的
而
final int a = 20;
short s = a; 是编译成功的,为什么,因为这时a就是final的,编译器把这个过程直接做了编译优化,认为等价于赋值
short s = 20;