测试类
package com.company;
public class Main {
public void testIPlus() {
int i = 0;
int j = i++;
}
public void testPlusI() {
int i = 0;
int j = ++i;
}
public static void main(String[] args) {
}
}
javap -v 反汇编后
public void testIPlus();
descriptor: ()V
flags: (0x0001) ACC_PUBLIC
Code:
stack=1, locals=3, args_size=1
0: iconst_0 将int类型常量0压入栈
1: istore_1 取出栈顶元素存入局部变量1
2: iload_1 把局部变量1压入栈(此时局部变量1的值为0)
3: iinc 1, 1 把一个常量值加到一个int类型的局部变量上 (局部变量1值加1)
6: istore_2 取出栈顶元素存入局部变量2
7: return
LineNumberTable:
line 6: 0
line 7: 2
line 8: 7
public void testPlusI();
descriptor: ()V
flags: (0x0001) ACC_PUBLIC
Code:
stack=1, locals=3, args_size=1
0: iconst_0 将int类型常量0压入栈
1: istore_1 取出栈顶元素存入局部变量1
2: iinc 1, 1 把一个常量值加到一个int类型的局部变量上 (局部变量1值加1)
5: iload_1 把局部变量1压入栈(此时局部变量1的值为0+1)
6: istore_2 取出栈顶元素存入局部变量2
7: return
LineNumberTable:
line 11: 0
line 12: 2
line 13: 7
2: iload_1 3: iinc 区别就是这两条指令的执行顺序 i++ 先把i的值压入操作数栈在加一 ++i 先把i加一再把i的值压入操作数栈
局部变量1就是i 局部变量2就是j 局部变量赋值的过程其实是从栈顶取值 这也是为什么导致 i++ 是先执行后加一 ++i 先加一后执行的原因