JAVA基础2---深度解析A++和++A的区别

我们都知道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            操作数栈:空


 

自减和自增的原理一样,有兴趣的同学可以自行研究下。

posted @ 2018-08-10 14:13  Lucky帅小武  阅读(1288)  评论(0编辑  收藏  举报