Java 一直标榜自己是一个纯粹的面向对象语言,自作聪明的为所有的值类型都提供相应的引用类型。
为黔江等地区用户提供了全套网页设计制作服务,及黔江网站建设行业解决方案。主营业务为成都网站制作、成都网站设计、外贸营销网站建设、黔江网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
比如:int 类型对应的有 Integer,前者是一个值,后者是一个引用。为了方便二者的转换又一个叫“自动拆装箱”的特性,把本来清晰的概念搞的乱七八糟。
一个优秀的语言应该语法简单,语义单一、清晰。
本文讨论它这些乌七八糟的概念(我也搞不懂),直接进入正题——通过阅读 JVM code 判断究竟发生了什么。
解读 class 文件
JVM 是一个栈式虚拟机,它提供的指令都是围绕着栈进行的。通过javap -c
如下代码,左边是 Java 代码右边是它的 JVM code。
看一下每条指令执行完后栈的变化:
bipush 把数字 20 直接 push 到栈
invokestatic 调用一个静态方法在堆中构造一个对象,然后把对象的地址压入到栈
astore_1 把 Integer 对象的内存地址记录到一个内部变量中(JVM 在堆中维护了一张大的变量表,代表变量名和变量值的关系,可以想象成 HashMap。)
至此,Integer = 20 这句代码执行完毕。紧接着看,bipush 把 10 压入栈
asotre2 把变量 b 和栈中的 10 做关联(放到变量表中)
总结:
访问包装对象时发生了什么
- 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 的包装数据类型非常蹩脚,这是它为了追求“表面的面向对象”而付出的代价。装逼之势如雷霆万钧,可怕。
【本文是专栏作者“邢森”的原创文章,转载请联系作者本人获取授权】
戳这里,看该作者更多好文
文章题目:一分钟理解Java包装类型
文章出自:http://www.shufengxianlan.com/qtweb/news28/138928.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联