public void method4() {
int i = 1;
int j = 2;
int a = i++;
int b = ++j;
}
使用javap -c 解开class后
0: iconst_1 //从常量池取出1放入操作栈顶
1: istore_1 //把操作栈顶元素保存到本地变量i中 i=1
2: iconst_2 //从常量池取出2放入操作栈顶
3: istore_2 //把操作栈顶元素保存到本地变量j中 j=2
4: iload_1 //把本地变量i放入操作栈顶i=1
5: iinc 1, 1 //执行把本地变量i+1 ,操作栈顶不变
8: istore_3 //把操作栈顶元素保存到本地变量a中
9: iinc 2, 1 //执行把本地变量j+1 ,操作栈顶不变
12: iload_2 //把本来变量j放入栈顶 j=3
13: istore 4 //把栈顶j保存到本地变量,即b=3
15: return
预备知识:
iconst 把int型数据放到操作栈顶
istore 把栈顶int元素保存到本地变量,移除栈顶元素
iload int本地变量放入栈顶
iinc 把int元素自动+1 如iinc 1,1 第一位是本地变量index,第二位是+的数值
iinc 不会改变栈顶元素的值,它只会改变本地变量的值
不知大家从上面的jvm 指令可以他们之前的不同没?
后++ 的顺序是load ----iinc---store
先++ 的顺序是iinc ----load---store
先前说过iinc不会改变栈顶,会直接修改本地变量的值,所有后++会把先前load的值原封不动的保存进去
而后++会先改变本地变量值,然后把本地变量捞出来,再保存
所以如果++i 和i++ 如果用于自增这两个是没有区别的,都相当于i=i+1,但如果是通过这个来赋值
如 int a = i++; int b = ++j; 那么a保存i原有值,b= j+1
注意
int i = 1; System.out.println(i++);
和
int i = 1;i++; System.out.println(i);
的区别,原理和上面一样