资讯专栏INFORMATION COLUMN

理解在java “”i=i++;”所发生的事情

BigTomato / 1752人阅读

浅谈java中的 “i=i++;”

首先有一下代码:

    public class Demo{
        public static void main(String []args){
            int i=12;
            i=i++;
            System.out.println(i);
        }
    }

你可以试想这段代码是多少 大多数同学可能会回答是13,然而事实并非如此,如下图结果:


在上图中,我首先进行了运行,可以看到结果,我们的i并不是如大多人猜测的那样为13输出 ,而是看上去没有做这个自增的操作,然而这是为什么呢?

于是,就有了后面反编译为字节码的操作,我们利用javap 指令反编译后可以看清楚其中发生的事情,有同学对其中的JVM指令不清楚,没关系,我这里先普及一下本文代码中所涉及的JVM指令;

(这里的关键指令码在于main方法之后,因此只针对于下面的指令进行解释,其之前的是虚拟机自动构建的默认构造方法的指令码)

1.bipush: 将单字节的常量值(-128~127)推送至栈顶
2.istore: 将栈顶int型数值存入指定本地变量
3.iload: 将指定的int型本地变量推送至栈顶
4.iinc: 该指令用于对本地(局部)变量进行自增减操作。该指令第一参数为本地变量的编号,第二个参数为自增减的数量
5.getstatic 获取指定类的静态域,并将其值压入栈顶(到这个位置之后就是调用静态对象out打印的操作不再赘述,感兴趣的同学可以在本文末尾附上的链接的去了解一下)

知道基本的几个指令之后我们来分析上图中关键指令的意思吧:

bipush 12这里是把12推至栈顶 栈里存储了12 这个int数值

istore_1 这里是把12弹出给第二个(备注:第1个本地变量应该是this)本地变量 即i=12

iload_1 这里是把第二个本地变量(i)的值推入栈顶 此时栈顶为12

iinc 1,1 自然是i=i+1 即i++ 这个时候i=13

istore_1这里是把栈顶值弹出给本地变量i,这个时候 i又被赋值为 12

因此最终 打印出来的时候i为12。

CSDN一老哥整理的JVM指令集合,很方便查询学习

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76594.html

相关文章

  • 16.java异常处理

    摘要:不受检查异常为编译器不要求强制处理的异常,检查异常则是编译器要求必须处置的异常。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当运行时系统遍历调用栈而未找到合适的异常处理器,则运行时系统终止。异常处理涉及到五个关键字,分别是。 概念 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。 异常是程序中的一些错误,但并不是所有的错误都是异常,并...

    asce1885 评论0 收藏0
  • 凯文•斯拉文:算法塑造世界

    摘要:在中,算法专家凯文斯拉文提起这个故事,并向观众展示了算法控制的图景。斯拉文把算法称之为计算机用于决策的数学。凯文斯拉文表示我们正在用炸药和岩石锯打穿美国,让算法能早微秒完成交易,所有的一切都是为了一个前所未有的通讯系统。 The Making of a Fly,这是一本1992年出版的学术书籍,受研究者喜欢。2011年4月8日,一家书商对其的售价为170万美元,另一家书商标价220万美元。如...

    iamyoung001 评论0 收藏0
  • 如何理解I/O多路复用

    摘要:为了讲清复用的是什么,首先得先说明一下逻辑流的概念。理解了这个,那么所谓的复用,指的就是在一个逻辑流里处理多个事件如何做到利用多路复用器,轮询监听各路,如果一旦有事件发生,那么就去处理,否则程序阻塞。 java nio提供了一套称为I/O多路复用的编程范式,那么什么叫做I/O多路复用呢?所谓的I/O多路复用,从字面意思上来理解,就是:有多个I/O操作(或是写,或是读,或是请求),这多个...

    desdik 评论0 收藏0
  • Java视角理解系统结构(二)CPU缓存

    摘要:从视角理解系统结构连载关注我的微博链接了解最新动态众所周知是计算机的大脑它负责执行程序的指令内存负责存数据包括程序自身数据同样大家都知道内存比慢很多其实在年前的频率和内存总线的频率在同一个级别访问内存只比访问寄存器慢一点儿由于内存的发展受到 从Java视角理解系统结构连载, 关注我的微博(链接)了解最新动态 众所周知, CPU是计算机的大脑, 它负责执行程序的指令; 内存负责存数据,...

    eternalshallow 评论0 收藏0
  • JVM 类初始化机制

    摘要:当你在程序中对象时,有没有考虑过是如何把静态的字节码转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇...

    20171112 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<