В соответствии с байтовым кодом , полученным из файлов классов,
Оба присваивания увеличивают x, но разница - это время when the value is pushed onto the stack
В Case1
, нажатие происходит (а затем назначается позже) до приращения (по существу означает, что ваш приращение ничего не делает)
В Case2
сначала происходит Инкремент (делает его 8), а затем помещается в стек (и затем назначается x)
Случай 1:
int x=7;
x=x++;
Байт-код:
0 bipush 7 //Push 7 onto stack
2 istore_1 [x] //Pop 7 and store in x
3 iload_1 [x] //Push 7 onto stack
4 iinc 1 1 [x] //Increment x by 1 (x=8)
7 istore_1 [x] //Pop 7 and store in x
8 return //x now has 7
Случай 2:
int x=7;
x=++x;
Байт-код
0 bipush 7 //Push 7 onto stack
2 istore_1 [x] //Pop 7 and store in x
3 iinc 1 1 [x] //Increment x by 1 (x=8)
6 iload_1 [x] //Push x onto stack
7 istore_1 [x] //Pop 8 and store in x
8 return //x now has 8