我来具体说明:
int i=0;
i=i++;
上述两行java代码bytecode如下:
iconst_0 //把常量0放到堆栈
istore_1 //把堆栈上的数(上面那个0)放到存储位置1,也就是i的存储位置,所以i的值就是0了
iload_1 //加载位置1上的整数值到栈顶,就是i,因此栈顶的值是0
iinc 1,1 //把位置1的数,也就是i,自增1,因此i变成了1(注意:iinc指令不会操作堆栈)
istore_1 //把栈顶的那个数,也就是0,存到位置1,因此i的值是0.
int i=0;
i=++i;
-->
iconst_0 //把常量0放到栈顶
istore_1 //把堆栈上的数(上面那个0)放到存储位置1,也就是i的存储位置,所以i的值就是0了,栈顶值不变
iinc 1,1 //把位置1的数,也就是i,自增1,因此i变成了1(注意:iinc指令不会操作堆栈)
iload_1 //加载位置1的数,也就是i的值,1,到栈顶
istore_1//把栈顶的值存到位置1,因此i的值就是1了。
了解字节码的操作:
http://blog.csdn.net/BU_BetterYou/archive/2008/06/16/2553108.aspx