我们都知道JAVA中A++和++A在用法上的区别,都是自增,A++是先取值再自增,++A是先自增再取值,那么为什么会是这样的呢?
1.关于A++和++A的区别,下面的来看个例子:
1 public class PlusPlusDemo { 2 public static void main(String[] args) { 3 test(); 4 } 5 6 public static void test() { 7 int a = 10; 8 System.out.println(a++);//结果为10,但是a的值最终为11 9 System.out.println(++a);//结果为12,a的值最终为12 10 } 11 }
虽然现在我们知道a++是先取值再自增,而++a是先自增再取值,那么它是怎么实现的呢,接下来我们来看下这段代码被JVM编译之后的字节码,如下:
1 public class com.luck.codehelp.test.exception.PlusPlusDemo { 2 public com.luck.codehelp.test.exception.PlusPlusDemo(); 3 Code: 4 0: aload_0 5 1: invokespecial #8 // Method java/lang/Object."<init>":()V 6 4: return 7 8 public static void main(java.lang.String[]); 9 Code: 10 0: invokestatic #16 // Method test:()V 11 3: return 12 13 public static void test(); 14 Code: 15 0: bipush 10 16 2: istore_0 17 3: getstatic #21 // Field java/lang/System.out:Ljava/io/PrintStream; 18 6: iload_0 19 7: iinc 0, 1 20 10: invokevirtual #27 // Method java/io/PrintStream.println:(I)V 21 13: getstatic #21 // Field java/lang/System.out:Ljava/io/PrintStream; 22 16: iinc 0, 1 23 19: iload_0 24 20: invokevirtual #27 // Method java/io/PrintStream.println:(I)V 25 23: return 26 }
其中从13行到25行是关于test方法的编译结果,现在来依行分析:
1.bipush 指令:将常量10加载到操作数----------------------------------------------------------------------------->>>局部变量表:空 操作数栈:10
2.istore_0:将操作数栈中的数值10加载到局部变量表中的第0位的变量a --------------------------------->>>局部变量表:a=10 操作数栈:空
3.getstatic:操作System类的静态字段out
4.iload_0:将局部变量表中的第0位的变量a的值加载到操作数栈中 ----------------------------------------->>>局部变量表:a=10 操作数栈:10
5.iinc 0,1:局部变量表中的第0位的变量a执行自增操作---------------------------------------------------------->>>局部变量表:a=11 操作数栈:10
6.invokevirtual:执行println()方法,从操作数栈获取到的值为10,打印结果为10------------------------->>>局部变量表:a=11 操作数栈:空
7.getstatic:操作System类的静态字段out
8.iinc 0,1:局部变量表中的第0位的变量a执行自增操作---------------------------------------------------------->>>局部变量表:a=12 操作数栈:空
9.iload_0:将局部变量表中的第0位的变量a加载到操作数------------------------------------------------------->>>局部变量表:a=12 操作数栈:12
10.invokevirtual:执行println()方法,从操作数栈获取到的值为12,打印结果为12------------------------>>>局部变量表:a=12 操作数栈:空
自减和自增的原理一样,有兴趣的同学可以自行研究下。