当前位置: 首页 > news >正文

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

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

首先有一下代码:

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

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

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

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

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

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

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

  1. bipush 12这里是把12推至栈顶 栈里存储了12 这个int数值
  2. istore_1 这里是把12弹出给第二个(备注:第1个本地变量应该是this)本地变量 即i=12
  3. iload_1 这里是把第二个本地变量(i)的值推入栈顶 此时栈顶为12
  4. iinc 1,1 自然是i=i+1 即i++ 这个时候i=13
  5. istore_1这里是把栈顶值弹出给本地变量i,这个时候 i又被赋值为 12

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

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

相关文章:

  • HDU 6342 Expression in Memories(模拟)多校题解
  • eclipse 更换国内镜像
  • @angular/forms 源码解析之双向绑定
  • C# 获取电脑的网络连接状态
  • leetcode 有效的字母异位词 java 版本
  • memset函数,strcpy函數,memcp函數
  • 老司机 iOS 周报 #30 | 2018-08-06
  • 机器学习 -- 机器学习是什么?
  • TCP三次握手四次挥手手动实践
  • 初识 Spring(05)---(Annotation注解)
  • win7系统已经够用为什么还要开发win10系统
  • python3 简单爬虫
  • HAP将新的页面加入到菜单
  • 常用的CSS各类属性
  • 从计算机知识到落地能力,你欠缺了什么?
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • ES10 特性的完整指南
  • ES6核心特性
  • JavaScript服务器推送技术之 WebSocket
  • JDK 6和JDK 7中的substring()方法
  • PHP变量
  • Quartz初级教程
  • webgl (原生)基础入门指南【一】
  • 阿里云购买磁盘后挂载
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 前端之React实战:创建跨平台的项目架构
  • 区块链共识机制优缺点对比都是什么
  • 如何用vue打造一个移动端音乐播放器
  • 数据仓库的几种建模方法
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #etcd#安装时出错
  • $ git push -u origin master 推送到远程库出错
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (70min)字节暑假实习二面(已挂)
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (一)Linux+Windows下安装ffmpeg
  • (转)LINQ之路
  • (转)母版页和相对路径
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .Net CF下精确的计时器
  • .NET gRPC 和RESTful简单对比
  • .NET 中 GetProcess 相关方法的性能
  • .NET 中创建支持集合初始化器的类型
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • :=
  • @ResponseBody
  • [20160807][系统设计的三次迭代]