转载自  一分钟理解Java包装类型

Java 一直标榜自己是一个纯粹的面向对象语言,自作聪明的为所有的值类型都提供相应的引用类型(不明白这两个概念,看之前的《一分钟理解传值和传引用》)比如:int 类型对应的有 Integer,前者是一个值,后者是一个引用。为了方便二者的转换又一个叫“自动拆装箱”的特性,把本来清晰的概念搞的乱七八糟。

一个优秀的语言应该语法简单,语义单一、清晰。

本文讨论它这些乌七八糟的概念(我也搞不懂),直接进入正题——通过阅读 JVM code 判断究竟发生了什么。

解读 class 文件

JVM 是一个栈式虚拟机,它提供的指令都是围绕着栈进行的。通过javap -c <className>查看一个 class 文件中的 JVM 指令。如下代码,左边是 Java 代码右边是它的 JVM code。

看一下每条指令执行完后栈的变化:bipush 把数字 20 直接 push 到栈

invokestatic 调用一个静态方法在中构造一个对象,然后把对象的地址压入到栈

astore_1 把 Integer 对象的内存地址记录到一个内部变量中(JVM 在堆中维护了一张大的变量表,代表变量名和变量值的关系,可以想象成 HashMap。)

至此,Integer = 20 这句代码执行完毕。紧接着看,bipush 把 10 压入栈

asotre2 把变量 b 和栈中的 10 做关联(放到变量表中)

总结:

  • 值变量所指向的内容(值)是放在栈中的,访问时直接操作栈

  • 引用变量所指向的内容(对象)是放在堆中的,访问时先把变量载入到栈(通过aload_1 指令,例子中没有出现),再操作。

访问包装对象时发生了什么

Integer c = null;
Integer d = 10;
int e = c + d;

JVM code 为

  • 包装对象的空指针问题

aconst_null 把一个空指针压入栈,astore_1 把栈顶的变量放入到变量表中,所以此时 a 是 null,所以会出现空指针错误。

  • 包装对象的计算方法

8-16 是计算两数相加,aload_1 把变量表中的变量压入栈,invokervirtual 指令把对象转换成 int 重新入栈;12、13 行的逻辑也是如此。 16 行执行整数相加。因为计算结果是 int 类型,所以最后通过 isotre_3 放到变量表。

自己分析

如果代码的最后一行写作Integer e = c + d;,JVM code 会变成

自己动手分析一下看看吧。

总结

Java 的包装数据类型非常蹩脚,这是它为了追求“表面的面向对象”而付出的代价。装逼之势如雷霆万钧,可怕。

一分钟理解Java包装类型相关推荐

  1. java弱引用怎么手动释放,十分钟理解Java中的弱引用,十分钟java引用

    十分钟理解Java中的弱引用,十分钟java引用 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,帮助大家理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限 ...

  2. 一分钟理解Java公平锁与非公平锁

    转载自  一分钟理解Java公平锁与非公平锁 和朋友聊天他提到:ReentrantLock 的构造函数可以传递一个 bool 数据,true 时构造的是"公平锁".false 时构 ...

  3. 深入理解Java注解类型(@Annotation)

    [版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/71860633 出自[zejian ...

  4. Java 包装类型的缓存机制

    Java包装类型的缓存机制 Integer 缓存机制 背景 Integer 最常见的面试题,就是问Integer的值如何比较相等.比如: Integer i1 = 33; Integer i2 = 3 ...

  5. java 包装类型_2.Java基本类型与包装类型

    java中的基本类型包含以下几个: byte.short.int.long.float.double.char.boolean 整型 其中byte.short.int.long都是表示整数的,只不过他 ...

  6. 理解Java枚举类型

    (参考资料:深入理解java enum) 1.原理:对编译后的class文件javap反编译可以看出,定义的枚举类继承自java.lang.Enum抽象类且通过public static final定 ...

  7. Java包装类型对象比较相等性注意事项

    废话不多说看代码: Integer a = 100; Integer b = 100; a == b 表达式结果为true a.equals(b) 表达式结果为trueInteger a = 1000 ...

  8. 理解基本包装类型Number,String,Boolean

    在前面我们知道了引用类型是什么了,也就能理解包装类型了.包装对象其实也是一种引用类型,之所以要单独提出来只不过是因为它们可以把原始类型的值变成(包装成)对象,这样它们也就获得了各自类型相应的特殊行为了 ...

  9. java包装类型作用,和基本类型区别

    Java中的8种基本数据类型都有对应的对象类型,但是既然有了基本数据类型,包装类型有什么作用呢?它们有什么区别呢? 答案是包装类型的出现是为了方便对基本类型进行操作.包装类型可以解决一些基本类型解决不 ...

最新文章

  1. 开发日记-20190914 关键词 汇编语言王爽版 第六章
  2. 高清监控如何选择交换机
  3. python类型和格式_json数据格式和python中字典的数据类型
  4. android缩放动画的两种实现方法
  5. 【极客学院出品】Cocos2d-X系列课程之六-用户交互事件处理方法
  6. QCC蓝牙芯片PIO操作
  7. 高德地图:热力图、点位基础使用
  8. 问卷及量表统计与SPSS实战
  9. Python:火山小视频-无水印视频-多线程-批量采集实现和完整代码
  10. IT从业者创业公司生存指南:创业中期 ---- 先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。
  11. C语言怎么把int类型转为char,c++ 如何把一个int转为char*
  12. 程序员必备:Git入门,超详细
  13. 把这304道React的面试题刷完,前端面试没有在怕的!
  14. 【JAVA EE#6】【传智书城·源码阅读】后台管理模块:权限控制+页面分析+商品管理+销售榜单+订单管理+公告管理+项目结构思维导图
  15. 酷开电视能装鸿蒙吗,最新酷开系统电视安装第三方应用教程【全能版】
  16. 几种常用的特征选择方法
  17. 医院HIS系统运维工作见闻
  18. C - Factors of Factorial(数学)
  19. 阿里巴巴校招笔试题型攻略
  20. AS01 AS02资产屏幕开发实例

热门文章

  1. [SpringBoot2]文件上传_单文件与多文件上传的使用
  2. [JavaWeb-HTML]HTML文本标签
  3. [蓝桥杯2016决赛]愤怒小鸟-模拟
  4. icoding复习6 图
  5. erlang rebar 配置mysql_Erlang Rebar 使用指南之四:依赖管理
  6. min_25 推导及例题总结
  7. CF750F. New Year and Finding Roots
  8. CF1526 D. Kill Anton
  9. 模板:Miller-RabinPollard-Rho(数论)
  10. P4770:你的名字(SAM、线段树合并)