我们都知道JAVA中A++和++A在用法上的区别,都是自增,A++是先取值再自增,++A是先自增再取值,那么为什么会是这样的呢?

1.关于A++和++A的区别,下面的来看个例子:

 public class PlusPlusDemo {
public static void main(String[] args) {
test();
} public static void test() {
int a = 10;
System.out.println(a++);//结果为10,但是a的值最终为11
System.out.println(++a);//结果为12,a的值最终为12
}
}

虽然现在我们知道a++是先取值再自增,而++a是先自增再取值,那么它是怎么实现的呢,接下来我们来看下这段代码被JVM编译之后的字节码,如下:

 public class com.luck.codehelp.test.exception.PlusPlusDemo {
public com.luck.codehelp.test.exception.PlusPlusDemo();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return public static void main(java.lang.String[]);
Code:
0: invokestatic #16 // Method test:()V
3: return public static void test();
Code:
0: bipush 10
2: istore_0
3: getstatic #21 // Field java/lang/System.out:Ljava/io/PrintStream;
6: iload_0
7: iinc 0, 1
10: invokevirtual #27 // Method java/io/PrintStream.println:(I)V
13: getstatic #21 // Field java/lang/System.out:Ljava/io/PrintStream;
16: iinc 0, 1
19: iload_0
20: invokevirtual #27 // Method java/io/PrintStream.println:(I)V
23: return
}

其中从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            操作数栈:空


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

JAVA基础2---深度解析A++和++A的区别的更多相关文章

  1. Java内存模型深度解析:基础部分--转

    原文地址:http://www.codeceo.com/article/java-memory-1.html 并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何 ...

  2. Java内存模型深度解析:总结--转

    原文地址:http://www.codeceo.com/article/java-memory-7.html 处理器内存模型 顺序一致性内存模型是一个理论参考模型,JMM和处理器内存模型在设计时通常会 ...

  3. Java内存模型深度解析:final--转

    原文地址:http://www.codeceo.com/article/java-memory-6.html 与前面介绍的锁和Volatile相比较,对final域的读和写更像是普通的变量访问.对于f ...

  4. Java内存模型深度解析:锁--转

    原文地址:http://www.codeceo.com/article/java-memory-5.html 锁的释放-获取建立的happens before 关系 锁是java并发编程中最重要的同步 ...

  5. 你必须掌握的Java基础:JSON解析工具-json-lib

    一.简介  json-lib是一个Java类库,提供将Java对象,包括beans,maps,collections,java arrays和xml等转换成JSON,或者反向转换的功能. 二.准备 在 ...

  6. java基础(9) - 泛型解析

    泛型 定义简单的泛型类 泛型方法 /** * 1.定义一个泛型类 * 在类名后添加类的泛型参数 <T> * 泛型类里面的所有T会根据创建泛型类时传入的参数确定类型 * 2.定义泛型方法 * ...

  7. JAVA基础-XML的解析

    一.XML的概述 XML的全名为可扩展标记语言(Extensible Markup Language),XML的作用为:1.传输,2.存取数据,3.软件的配置文件.传输现在都用更轻量的Json,而存储 ...

  8. java基础篇---XML解析(二)

    XML解析之最流行的方式:DOM4J dom4j是使用java语言编写的,用于读,写,操作XML的一套组件 dom4j是一个开源的java组件,可从http://sourceforge.net/pro ...

  9. java基础篇---XML解析(一)

    XML是可扩展标记语言 在XML文件中由于更多的是描述信息的内容,所以在得到一个xml文档后应该利用程序安装其中元素的定义名称去除对应的内容,这样的操作称为XML解析. 在XML解析中W3C定义SAX ...

随机推荐

  1. Centos7之Systemd风格

    Unit(单元) /usr/lib/systemd/system       每个服务最主要的启动脚本设置,类似于之前的/etc/init.d目录 关键特性 1.基于socket的激活机制,socke ...

  2. Auth认证模块

    1.auth简介 auth是什么? auth是django内置的用户认证系统,可以快速的实现:登录,注销,修改密码........ 2.autho的使用 1)先创建超级用户 python3 manag ...

  3. Spark SQL 函数全集

    org.apache.spark.sql.functions是一个Object,提供了约两百多个函数. 大部分函数与Hive的差不多. 除UDF函数,均可在spark-sql中直接使用. 经过impo ...

  4. 【设计模式】用追MM来解释23种设计模式,转

    创建型模式 1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了.麦当劳和肯德基 ...

  5. 【Linux】-NO.8.Linux.4.Command.1.001-【Common Command】-

    1.0.0 Summary Tittle:[Linux]-NO.8.Linux.4.Command.1.001-[Common Command]- Style:Linux Series:Command ...

  6. NO Route to Host 连接mysql数据库

    显然是请求被服务器的防火墙给拦截了 1,vi /etc/sysconfig/iptables 2,在倒数第三行以前添加 -A INPUT -p tcp -m state --state NEW -m  ...

  7. [LeetCode] 100. Same Tree_Easy tag: DFS

    Given two binary trees, write a function to check if they are the same or not. Two binary trees are ...

  8. CentOS6.5如何设置NAT网络方式

    如何设置虚拟机与外网的连通. 今天说一下NAT的配置方法,其它两个都比较简单. 1.配置CentOS的IP [root@mycentos ~]# vi /etc/sysconfig/network-s ...

  9. 修改easydialog标题

    使用easyui作为前台框架极大的节省了项目资源,easyui官网文档中基本上囊括了所有的方法,但一些灵活性的方法文档中是找不到的,比如说动态替换窗口的属性,下边简单介绍些如何快速替换窗体的title ...

  10. 基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0

    基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0 目录 1. 开发环境2. 主要功能逻辑介绍3. 框架功能简介 4. 数据库的创建 5. 框架模块详细介绍6. Tes ...