JAVA基础2---深度解析A++和++A的区别
我们都知道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的区别的更多相关文章
- Java内存模型深度解析:基础部分--转
原文地址:http://www.codeceo.com/article/java-memory-1.html 并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何 ...
- Java内存模型深度解析:总结--转
原文地址:http://www.codeceo.com/article/java-memory-7.html 处理器内存模型 顺序一致性内存模型是一个理论参考模型,JMM和处理器内存模型在设计时通常会 ...
- Java内存模型深度解析:final--转
原文地址:http://www.codeceo.com/article/java-memory-6.html 与前面介绍的锁和Volatile相比较,对final域的读和写更像是普通的变量访问.对于f ...
- Java内存模型深度解析:锁--转
原文地址:http://www.codeceo.com/article/java-memory-5.html 锁的释放-获取建立的happens before 关系 锁是java并发编程中最重要的同步 ...
- 你必须掌握的Java基础:JSON解析工具-json-lib
一.简介 json-lib是一个Java类库,提供将Java对象,包括beans,maps,collections,java arrays和xml等转换成JSON,或者反向转换的功能. 二.准备 在 ...
- java基础(9) - 泛型解析
泛型 定义简单的泛型类 泛型方法 /** * 1.定义一个泛型类 * 在类名后添加类的泛型参数 <T> * 泛型类里面的所有T会根据创建泛型类时传入的参数确定类型 * 2.定义泛型方法 * ...
- JAVA基础-XML的解析
一.XML的概述 XML的全名为可扩展标记语言(Extensible Markup Language),XML的作用为:1.传输,2.存取数据,3.软件的配置文件.传输现在都用更轻量的Json,而存储 ...
- java基础篇---XML解析(二)
XML解析之最流行的方式:DOM4J dom4j是使用java语言编写的,用于读,写,操作XML的一套组件 dom4j是一个开源的java组件,可从http://sourceforge.net/pro ...
- java基础篇---XML解析(一)
XML是可扩展标记语言 在XML文件中由于更多的是描述信息的内容,所以在得到一个xml文档后应该利用程序安装其中元素的定义名称去除对应的内容,这样的操作称为XML解析. 在XML解析中W3C定义SAX ...
随机推荐
- c语言递归函数的调用
int fun(); int main() { int n,sum=0,i; scanf("%d",&n); for (i=1; i<=n; i++) { sum+= ...
- ORACLE12C架构图
- Cglib动态代理实现原理
Cglib动态代理实现方式 我们先通过一个demo看一下Cglib是如何实现动态代理的. 首先定义个服务类,有两个方法并且其中一个方法用final来修饰. public class PersonSer ...
- abap调用代码块
1:abap 调用代码块. *&---------------------------------------------------------------------* *& Re ...
- ELKStack的基础入门和中文指南
一.ELKStack的中文指南 redhat系列配置repo源 rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch vi / ...
- ODS与DW之间的关系
1.什么是数据仓库? 数据仓库是面向主题的.集成的.相对稳定的.反应历史变化的数据集合,主要用于决策支持和信息的全局共享. 时效:T+1 2.什么是ODS? ODS全称为Operational Dat ...
- python tkinter Treeview 事件绑定
def trefun(event): sels= event.widget.selection()#event.widget获取Treeview对象,调用selection获取选择对象名称 for i ...
- cocos2dx JS 游戏切到后台再进入游戏的处理
由于Cocos引擎中,游戏切入后台后定时器后停掉会让某个Animation动作停止. 导致当重新进入游戏时,看到的不是你想要的画面.或者定时器倒计时的时间对不上等问题. cc.game.EVENT_H ...
- 12月centos单词
---恢复内容开始--- UNreachable:adj.(network server unreachable) 不能达到的; 及不到的; 取不到的; 不能得到的; rsync: rsync [re ...
- !! zcl_TD 用法注释02 力攻(动能<4)
力攻(动能<4)创新高下M5可持有力攻(动能<4)不创新高下M5可减仓