代码编织梦想

有如下代码:

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

运行后,发现结果为10,而不是11。这是为什么呢?

首先先介绍一个JDK自带的反编译工具: javap命令。 可以看到到底底层是怎么执行上面的代码的!

先编译Main.java文件

C:\leetcode\src\com\lilike>javac Main.java

此时在Main.java 目录下生成了Main.class文件。
然后执行javap命令:

C:\leetcode\src\com\lilike>javap -c Main
警告: 二进制文件Main包含com.lilike.Main
Compiled from "Main.java"
public class com.lilike.Main {
  public com.lilike.Main();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: bipush        10
       2: istore_1
       3: iload_1
       4: iinc          1, 1
       7: istore_1
       8: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      11: iload_1
      12: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
      15: return
}

上面的0,2,3,4,7操作,就是底层i = i ++的执行过程,我们先解释这五项操作,在文章的末尾再补充虚拟机指令的知识。

0: bipush        10  //将参数10压入栈
2:istore_1     //栈中弹出一个数(10),赋值给局部变量i(_1表示赋值给第一个局部变量,即i)
3: iload_1  //将局部变量i(_1表示第一个局部变量,即i)的值入栈,此时栈顶的值为10
4: iinc     1, 1  //指令iinc对给定的局部变量做自增操作
//1,1表示对第一个局部变量i进行累加1操作,意味着i变为了11
7: istore_1   //栈顶弹出一个数:也就是10,赋值给第一个局部变量i。意味着i的值又变回10了。(_1表示赋值给第一个局部变量,即i)

最终打印结果 就是: 10

扩充知识-- java虚拟机指令:
bipush:当int取值-128~127时,JVM采用bipush指令将常量压入栈中。
istore:将栈顶int型数值存入指定本地变量
aload:从局部变量表的相应位置装载一个对象引用到操作数栈的栈顶。还有一些其他相似的操作码用来装载非对象引用,包括iload_、lload_、fload_和dload_,这里的i代表int型,l代表long型,f代表float型以及d代表double型。
iinc:变量自增。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/m0_46864744/article/details/111095294

JavaEE之Mybatis关系映射-爱代码爱编程

JavaEE之Mybatis关系映射 创建封装工具类一对一(旅客与护照)创建数据表创建相应实体类创建DAO接口创建Mapper文件注册Mapper文件测试一对多(部门与职员)创建数据表创建相应实体类创建DAO接口创建Mapper文件注册Mapper文件测试多对多(学生与科目)创建数据表创建相应实体类创建DAO接口创建Mapper文件注册Mapper

继承和多态,循环打印单选题和多选题题目,判断是否正确,-爱代码爱编程

每天作业 /** * Question 属性: 题号 题干 选项 * 方法: * 打印题目 判断正确与否 * 子类: * 单选题 多选题 * 属性 : answer 正确答案 * 创建两个单选 两个多选 循环打印信息 */ 父类Questionpackage Day1213; //父类 public class

MyEclipse8.5 搭载 jdk1.8 和 Tomcat7.0-爱代码爱编程

具体步骤 转载出处:LemmonTreelss ① 打开MyEclipse,去到Window的Preferences中模糊搜索Tomcat ② 找到开发工具中所支持的最高Tomcat版本,将其Tomcat server设为Enable ③ 设置完成后浏览本机的Tomcat安装位置,找到bin的上一层目录后点击确定,路径引入完成 ④ 再次来到

Java IO流初相识-爱代码爱编程

流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出 。—百度百科 Java中IO流的分类 按照流的流向: 分为输入流和输出流 通

构造器(构造方法)-爱代码爱编程

知识点: 1.一个类即使什么都不写,他也会存在一个方法:构造器(构造方法)。 2.构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有。   3.构造方法的调用是在创建一个对象时使用new操作进行的。构造方法的作用是初始化对象。  4.有参构造:一旦定义了有参构造,无参一定要写出来! package courses.anyu.OP

日常小记:springcloud gateway使用-爱代码爱编程

文章目录 1 Route Predicate Factories1.1 The After Route Predicate Factory1.2 The Cookie Route Predicate Factory1.3 The Weight Route Predicate Factory2 GatewayFilter Factories2.1 T

54-B2-03-0D-5B-27 2019 第一行代码 项目二-爱代码爱编程

实验目的 通过手动创建活动,拓展其功能,从而进一步加深对Android Sudio的更深层次理解。 软件 Android Sudio 实验步骤 1、打开Android Studio新建一个项目,这里选择空白模板(no Add Activity),并命名,点击Finish完成创建。 2、创建完成进入主界面,右击com.example.activit

Python网络编程之六:操作系统发展史及网络编程总结-爱代码爱编程

Python网络编程之六:操作系统发展史及网络编程总结 现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成。 现代计算机系统是一个复杂的系统。 一、为什么要有操作系统 程序员无法把所有的硬件操作细节都了解到,管理这些硬件并且加以优化使用是非常繁琐的工作,这个繁琐的工作就是操作系统来干的

java-类与对象(简单易懂,一看就会)-爱代码爱编程

java-类与对象 类与对象的概念类与对象的定义与使用实例代码 类与对象的概念 类:具有的相同、相似的属性、特征、行为方式、功能的一类事物的抽象,例如王者荣耀游戏里的英雄是一个类。 对象:是类的具体实例,例如王者荣耀游戏里的英雄李白就是一个对象。 类与对象的定义与使用 类的定义: 关键字class ,类要写在同名的 .java文件中 ,

Java流的分类及其常见的类。-爱代码爱编程

下面是Java流的分类情况 空格代表继承关系 我们可以看到无论是字符流和字节流中每一个输入流(InputStream,Reader)都有相互对应的输出流(OutputStream,Writer). 字节流 InputStream  FlieInputStream  PipedInputStream  ObjectInputStream  ByteArra

N0.1每周心得-爱代码爱编程

#加入小组已经有几周的时间了,今天谈谈我这几周生活和学习上的改变 生活方面: 从暑假的每天睡懒觉到现在的准时准点到小组学习 ,每天都过得很充实,虽然和我步入大学之前想象中的轻松娱乐大学生活不太一样,但忙碌充实也让我感悟到了大学真正的魅力:提升自己,成为更优秀的自己。 并且这周六我们小组聚餐中,有机会能和学长学姐们深入交流,学长学姐给我们分享在大学中的生

Java并发编程:并发中死锁的形成条件及处理-爱代码爱编程

死锁是一种无限的互相等待的状态,两个或两个以上的线程或进程构成一个互相等待的环状。以两个线程为例,线程一持有A锁同时在等待B锁,而线程二持有B锁同时在等待A锁,这就导致两个线程互相等待无法往下执行。现实生活中一个经典的死锁情形就是四辆汽车通过没有红绿灯的十字路口,假如四辆车同时到达中心的,那么它们将形成一个死锁状态。每辆车拥有自己车道上的使用权,但同时也在