1.首先我们我们有这样一段代码
2.我们用javap -c 命令将Test01反编译成字节码文件
3.我们主要来分析test()方法中代码,通过jvm指令分析
Code:
0: iconst_0 //将常量0压入操作数栈,变量i
1: istore_1 //将操作数栈中int类型值存入局部变量1
2: iconst_0 //将常量0压入操作数栈,变量j
3: istore_2 //将操作数栈中int类型值存入局部变量2
4: iload_1 //从局部变量1中加载int类型值 ,压入操作数栈,此时栈中值是0
5: iinc 1, 1 //把一个常量值1加到一个int类型的局部变量1(i)上 ,注意此时局部变量i+1=1,但是1是在局部变量中,而操作数栈中的值还是0
8: istore_1 //将操作数栈中int类型值存入局部变量1,此时是将操作数栈中的0重新存入了到变量1中,变量1(i) = 0
9: iinc 2, 1 //把一个常量值1加到一个int类型的局部变量2(j)上 ,注意此时局部变量j+1=1,但是在此时我们并没有将局部变量装载到操作数栈
12: iload_2 //从局部变量2中加载int类型值 ,压入操作数栈,此时栈中值是1
13: istore_2 //将操作数栈中int类型值存入局部变量2,此时操作数栈中值是1 存入到变量2中,变量2(j)=1
14: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
17: iload_1 //又将局部变量1存入操作数栈中
18: invokevirtual #8 // Method java/io/PrintStream.println:(I)V 输出变量1
21: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
24: iload_2 //又将局部变量2存入操作数栈中
25: invokevirtual #8 // Method java/io/PrintStream.println:(I)V 输出变量2
28: return
4.总结,
i++ jvm执行时,是先将i放入操作数栈中,再对局部变量i做+1操作,这样接下来再对i做计算时取的是操作数栈中的数据
++i jvm执行时,是先做++,将局部变量i做+1操作,之后将i放入操作数栈中,这样接下来在对i做 计算时取的就是操作数栈中+1后的值了。
主要就是++操作是直接在局部变量上+1 ,而不是通过操作数栈来完成的。
以上凭自己理解所写。