一分钟理解Java包装类型
Java 一直标榜自己是分钟一个纯粹的面向对象语言,自作聪明的理解类型为所有的值类型都提供相应的引用类型。
比如:int 类型对应的包装有 Integer,前者是分钟一个值,后者是理解类型一个引用。为了方便二者的包装转换又一个叫“自动拆装箱”的特性,把本来清晰的分钟概念搞的乱七八糟。
一个优秀的理解类型语言应该语法简单,语义单一、包装清晰。分钟
本文讨论它这些乌七八糟的理解类型概念(我也搞不懂),直接进入正题——通过阅读 JVM code 判断究竟发生了什么。包装
解读 class 文件
JVM 是分钟一个栈式虚拟机,它提供的理解类型指令都是围绕着栈进行的。通过javap -c <className>查看一个 class 文件中的包装 JVM 指令。云南idc服务商
如下代码,左边是 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 为

(1) 包装对象的空指针问题
aconst_null 把一个空指针压入栈,astore_1 把栈顶的变量放入到变量表中,网站模板所以此时 a 是 null,所以会出现空指针错误。
(2) 包装对象的计算方法
8-16 是计算两数相加,aload_1 把变量表中的变量压入栈,invokervirtual 指令把对象转换成 int 重新入栈;12、13 行的逻辑也是如此。 16 行执行整数相加。
因为计算结果是 int 类型,所以最后通过 isotre_3 放到变量表。
自己分析
如果代码的最后一行写作Integer e = c + d;,JVM code 会变成

自己动手分析一下看看吧。
总结
Java 的包装数据类型非常蹩脚,这是它为了追求“表面的面向对象”而付出的代价。装逼之势如雷霆万钧,可怕。
【本文是专栏作者“邢森”的原创文章,转载请联系作者本人获取授权】
戳这里,看该作者更多好文
相关文章
让你的电脑更潮!教你装配ARGB风扇(打造炫酷的电脑外观,为你的电脑升级护航)
摘要:现如今,个性化电脑已经成为一种时尚潮流。而ARGB风扇全彩RGB风扇)以其多彩变幻的灯效成为了炫酷电脑装机的新宠。在这篇文章中,我们将带您了解ARGB风扇的安装方法及相关注意事项...2025-11-04
“HTTP/2 快速重置”零日漏洞被利用发起历史上最大规模的 DDoS 攻击
据外媒报道,Cloudflare、谷歌和 AWS 周二透露,恶意行为者已利用名为“HTTP/2 Rapid Reset”的新零日漏洞发起互联网历史上最大规模的分布式拒绝服务 (DDoS) 攻击。Clo2025-11-04
Tubes是一套面向C端搭建场景,支持灵活扩展、极致性能和高稳定性的终端渲染解决方案,目前广泛运用在淘宝、天猫,包括:双11、618会场、淘宝新人版首页等业务场景。介绍响应性数据系统指的是程序在使用系2025-11-04- 复制/usr/local/nagios/bin/nagios-v/usr/local/nagios/etc/nagios.cfg 1.2.2025-11-04
 iOS11Beta1(探索iOS11Beta1带来的全面升级和创新特性)
摘要:在移动操作系统领域,iOS一直以来都是引领潮流和创新的代表。如今,iOS11Beta1的发布带来了更多令人兴奋的功能和变化,为用户带来了一场全新的体验。本文将深入探索iOS11Be...2025-11-04- 登录系统和日志源登录培训是SOC运营的关键部分,尤其是对于新SOC而言,对于已建立的SOC而言也是如此;没有任何IT资产会永远保持不变。登录是将系统添加到SOC范围的过程的名称。这意味着确保来自这些系2025-11-04
 

最新评论