我下图代码第五行和第九行分别定义了一个整型变量和一个整型常量:

static final int number1 = 512;

static int number3 = 545;

Java程序员都知道两者的区别。

下面我们就用javap将.class文件反编译出来然后深入研究Java里整型变量和整型常量的区别。

使用命令行javap -c constant.ConstantFolding查看.class文件反编译出来的字节码:

结果:

这些字节码指令的说明,在wikipedia里有说明:

咱们Java程序员不需要把它们都背下来,只需要把这个网页收藏起来,要用的时候当成字典来用就行:

sipush 545: 将整数545放置到栈上

putstatic #16:

将栈上的值545赋给当前类的静态字段里。

那么putstatic #16里的#16代表什么含义?

我们再用javap -v 参数反编译,就能看到这个类的常量池(Constant pool). 大家看下图蓝色高亮的一行:

constant/ConstantFolding.number3:I

说明#16代表类constant.ConstantFolding的成员number3,类型为I。

至此,这两行字节码指令联合起来,实际对应了我们写的Java代码:

static int number3 = 545;

我们继续分析javap反编译出来的字节码。

aload_0: 将序号为0的本地变量的引入加载到栈上

invokespecial: 调用对象实例上的成员方法,如果有返回值,方法的返回值存储到栈上。具体调用的方法由#标识,可在常量池中查询到对应的方法名。

ldc: 将常量池上代号为#的常量的值从常量池加载到栈上。

我们从下图的常量池列表能发现,序号为#29的常量318976正是整型常量number1(512)和整型常量(623)的积。由此可以看出, number1 * number2这个表达式,因为参与运算的两个操作数通过STATIC和FINAL修饰成为了整型常量,因此其积在编译期就能得到,所以编译器在编译时就计算出来,存储在变量池里,序号为#29。

那么整型变量做乘法运算,对应的字节码又是什么样的呢?

从下图序号为3的code开始:

getstatic #16: 将类的静态成员#16加载到栈上。#16对应的成员为number3,值为545。

getstatic #18: 将类的静态成员#18加载到栈上。#18对应的成员为number4,值为619。

imul: 执行栈上两个整数的乘法运算。

istore_2: 将结果保存到局部变量2里。

此时,我们Java代码里的int product2 = number3 * number4就执行完了。

大家看到的剩下的蓝色字节码,都对应了下面这行打印语句。

System.out.println("Value: " + product1 + " , " + product2);

从这些字节码也能看出,Java里我们直接用加号进行字符串拼接操作,Java编译器在编译时,自动使用了StringBuilder进行优化。

既然整型变量的乘积需要打印出来,因此字节码的iload_2将之前用istore_2保存在局部变量2中的计算结果又加载到栈上,这样乘积结果最后就能输出了。

希望通过这个简单的例子,大家能学会用javap去深入理解一些Java和JVM的细节

java 整型常量_使用javap深入理解Java整型常量和整型变量的区别相关推荐

  1. 游戏装备强化java机制_从游戏中理解Java特性,我悟了!

    想学好一门开发语言,掌握了它的语言特性,学习起来往往能达到事半功倍的效果,自从接触到Java这个词,想必被灌输最多的就是Java是面向对象的编程的,要记住一点万物皆可对象,所有的特性都是基于对象来展开 ...

  2. java是什么软件?如何理解Java?

    大家在学习Java的时候,听到大家说Java是什么软件?今天老夫就告诉大家,java它其实不是软件,这里给各位初学者们详细解释一下.接下来详细的介绍下. java是什么软件?如何理解Java? 通俗的 ...

  3. 红黑树在java中的作用_带你真正理解Java数据结构中的红黑树

    红黑树是平衡的二叉树,它不是一个完美的平衡二叉树,但是在动态插入过程中平衡二叉搜索树的代价相对较高,所以红黑树就此出现,下面就让爱站技术频道小编带你一起进入下文了解一下吧! 一.红黑树所处数据结构的位 ...

  4. java书籍_非科班,自学java需要把软件工程的课程全部学习完吗?

    问题一:非科班是否能自学Java.问题二:自学Java是否需要把软件工程课程全部学完?问题三:如何自学Java? 解决问题一:非科班是否能自学Java.不知道你是否有这个担心疑虑,从事Java技术开发 ...

  5. [转载] 夯实Java基础系列8:深入理解Java内部类及其实现原理

    参考链接: Java内部类 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tut ...

  6. 夯实Java基础系列14:深入理解Java枚举类

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  7. 夯实Java基础系列18:深入理解Java内部类及其实现原理

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  8. java队列_如何彻底搞懂 Java 数据结构?CSDN 博文精选

    作者 | 张振华.Jack 责编 | 郭芮 出品 | CSDN 博客 本文和大家一起来重温<Java数据结构>经典之作. Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? ...

  9. java安装_我最喜欢的Java高级开发人员书籍

    java安装 我上一篇博客文章(我对高级Java开发人员的十个最喜欢的在线资源)的想法,是由Xiaoran Wang发表的 "面向高级Java开发人员的十大网站"的启发. Wang ...

  10. 无责任书评:每个Java程序员都应该深入理解Java虚拟机!

    Java这门语言的发展是很有意思的,它不像Python, Ruby 等完全是开源社区驱动,也不像C#,VB.NET主要由微软操刀.它是一个以Oracle(之前是Sun)为主,各大巨头一起参与,一起制定 ...

最新文章

  1. Erlang服务端开发(无需Erlang基础)笔试题
  2. ios app 砸壳
  3. KenBurns特效组件KenBurnsView
  4. 基于DVB-T标准,COFDM调制系统的利用导频信号进行符号粗同步
  5. windows下kafka源码阅读环境搭建
  6. android常用网址
  7. AI (1)---没错,AR其实也是AI
  8. 【月薪三万】听说深圳老师工资全国最高!!!比德国还高
  9. Linux平台下Ntop流量监测安装,并实现Netflow全过程
  10. 【转】opencv 配置
  11. 串口控件MSCOMM的注册方法(使用MSCOMM串口控件程序的运行问题)
  12. Redis过期删除策略
  13. 你是否还记得自己的手机号在哪些网站上面注册过呢?
  14. cracker.jar 文件打不开
  15. MySQL数据库修改数据库名的三种方式
  16. VS2008的安装注意事项
  17. 计算器软件测试数据,计算器软件测试报告.doc
  18. luogu P2198 杀蚂蚁
  19. 耳朵上的艺术品,飞利浦圈铁真无线耳机JT60无敌了!
  20. R语言和医学统计学(8):logistic回归

热门文章

  1. CUDA编程第五章: 共享内存常量内存
  2. 使用python PIL 模块合成图片
  3. 婚姻法新解释引女方净身出户担忧 或导致房产加名热
  4. 7. ShowWindow
  5. python爬取中国大学排名_Python爬取中国大学排行榜
  6. 电脑无法从U盘启动的问题解决
  7. 已有虚拟磁盘多个vmdk文件导入虚拟机
  8. 做出胶卷的效果——图片循环滚动播放
  9. pipe()函数详解
  10. Contest3115 - 2021级新生个人训练赛第23场_问题 H: 家庭作业