zoukankan      html  css  js  c++  java
  • 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            操作数栈:空


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

  • 相关阅读:
    ExtJs2.0学习系列(1)Ext.MessageBox
    PDF加水印
    ExtJs2.0学习系列(2)Ext.Panel
    负载均衡(续)
    位运算设置权限续(转)
    Excel导出问题解决方案(导出时前面的0自动被去掉)
    SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
    位运算设置权限
    WCF开发实战系列一:创建第一个WCF服务
    通过SQL Server的位运算功能巧妙解决多选查询
  • 原文地址:https://www.cnblogs.com/jackion5/p/9452909.html
Copyright © 2011-2022 走看看