关于局部变量表和操作数栈就不多讲了,网上有很多内容
这里关于a++和++a编译成字节码后的区别做一下测试:
这是int b = a++
int a = 1;
int b = a++;得到字节码
Code:
0: iconst_1 //将常量1入操作数栈
1: istore_1 //从操作数栈顶取值,放入局部变量表编号为1的位置
-------以上字节码完成了对a=1的赋值
2: iload_1 //将局部变量表中编号为1的位置加载到操作数栈栈顶--->栈顶=1
3: iinc 1, 1 //局部变变量表编号为1的位置直接+1
6: istore_2 //从操作数栈顶取值,放入局部变量表编号为2的位置 -->也就是把1赋给局部变量b
7: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_2
11: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
14: return
--------------------------------------------------------分割线--------------------------------------------------------------
int a = 1;
int b = ++a;得到字节码
Code:
0: iconst_1
1: istore_1
2: iinc 1, 1
5: iload_1
6: istore_2
7: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_2
11: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
14: return
注意颜色标注的那几行
这里直接给结论:
b=a++是将a的值先入操作数栈,然后局部变量表的a自增,局部变量表的b从操作数栈取值
b=++a是局部变量表a先自增,然后局部变量表a的值入栈,局部变量表的b从操作数栈取值