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 ...
随机推荐
- 两个java工程之间的相互调用方法
如果你有两个java项目的话,如何向他们之间进行信息的通信前提:必须知道要通信的java项目(接收请求方)的服务器的IP地址和访问路径.其实两个java项目之间的通信还是使用HTTP的请求.主要有两种 ...
- 注意:WordPress栏目别名slug不要设为p
这几天ytkah接了一个WordPress项目,没用多少时间就搞定了,交付给甲方使用,刚开始还算顺利,突然有一天其中一个栏目及栏目下是文章都无法访问了,出现404页面,其他页面都可以.询问他们最近改动 ...
- elasticsearch中文分词器ik-analyzer安装
前面我们介绍了Centos安装elasticsearch 6.4.2 教程,elasticsearch内置的分词器对中文不友好,只会一个字一个字的分,无法形成词语,别急,已经有大拿把中文分词器做好了, ...
- 20171018 在小程序页面去获取用户的OpenID
1. 在小程序的.js 文件中增加代码 //加载页面时到后台服务去获取openID onLoad: function (options) { //OpenId wx.login({ //获取code ...
- NYOJ 方案数量
1.递归求解(直接递归会超时,要用备忘录法) # include<iostream> # include<stdio.h> #include <map> using ...
- vue 手指长按触发事件
按钮 <span class="btn" @touchstart="gtouchstart()" @touchmove="gtouchmove( ...
- 【Tools】-NO.4.Tools.1.VM.1.001-【VMware Workstation PRO 12 Install CentOS 7.1】-
1.0.0 Summary Tittle:[Tools]-NO.4.Tools.1.VM.1.001-[VMware Workstation PRO 12 Install CentOS 7.1]- S ...
- pycharm tips
批量更改变量名,就在该变量名上shift+f6 ../data 两个点,就是上一级目录,一个点就是当前目录 unhashable type: 'list' 使用set进行去重 a = [1,2,2,3 ...
- 超实用教程,教你用墨刀做出小红书app原型
一个新手怎么用1小时快速学会APP原型设计? 1小时很短,这意味着学习时必须把握APP原型设计中的重点.难点,而非面面俱到. 要在短时间内理解.掌握一个工具的使用,最有效的方式莫过于临摹: 看实例视频 ...
- 定位crash的问题
一般都要符号化crash日志,但是低内存奔溃却没有堆栈日志 A Low Memory report differs from other crash reports in that there are ...