我们都知道JAVA中A++和++A在用法上的区别,都是自增,A++是先取值再自增,++A是先自增再取值,那么为什么会是这样的呢?
1.关于A++和++A的区别,下面的来看个例子:
1 public classPlusPlusDemo {2 public static voidmain(String[] args) {3 test();4 }5
6 public static voidtest() {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 classcom.luck.codehelp.test.exception.PlusPlusDemo {2 publiccom.luck.codehelp.test.exception.PlusPlusDemo();3 Code:4 0: aload_05 1: invokespecial #8 //Method java/lang/Object."":()V
6 4: return
7
8 public static voidmain(java.lang.String[]);9 Code:10 0: invokestatic #16 //Method test:()V
11 3: return
12
13 public static voidtest();14 Code:15 0: bipush 10
16 2: istore_017 3: getstatic #21 //Field java/lang/System.out:Ljava/io/PrintStream;
18 6: iload_019 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_024 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 操作数栈:空
自减和自增的原理一样,有兴趣的同学可以自行研究下。