Потому что компилятор заменяет 10*3
30 во время самой компиляции . Итак, эффективно: short thirty = 10 * 3
вычисляется во время компиляции.
Попробуйте изменить ten
и three
на final short
(заставить их компилировать константы времени) и посмотрите, что произойдет: P
Изучите использование байт-кода javap -v
для обеих версий ( 10*3
и final short
). Вы увидите, что разница небольшая.
Итак, вот разница в байтовом коде для разных случаев.
Случай 1 :
Код Java: main () {short s = 10 * 3; }
Байт-код:
stack=1, locals=2, args_size=1
0: bipush 30 // directly push 30 into "s"
2: istore_1
3: return
Случай -2:
public static void main(String arf[]) {
final short s1= 10;
final short s2 = 3;
short s = s1*s2;
}
Байт-код:
stack=1, locals=4, args_size=1
0: bipush 10
2: istore_1
3: iconst_3
4: istore_2
5: bipush 30 // AGAIN, push 30 directly into "s"
7: istore_3
8: return
Случай -3:
public static void main(String arf[]) throws Exception {
short s1= 10;
short s2 = 3;
int s = s1*s2;
}
Байт-код:
stack=2, locals=4, args_size=1
0: bipush 10 // push constant 10
2: istore_1
3: iconst_3 // use constant 3
4: istore_2
5: iload_1
6: iload_2
7: imul
8: istore_3
9: return
В приведенном выше случае 10
и 3
берутся из локальных переменных s1
иs2
short thirty = 10 * 3;
скорее всего заменяетсяshort thirty = 30;
компилятором, который тогда является допустимым оператором. (Хотя мне придется поискать соответствующий раздел JLS).