一分钟理解Java包装类型

作者: 老男孩_Misaya | 来源:发表于2018-08-21 22:42 被阅读5次

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

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

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

解读 class 文件

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

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

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

astore_1 把 Integer 对象的内存地址记录到一个内部变量中(JVM 在堆中维护了一张大的变量表,代表变量名和变量值的关系,可以想象成 HashMap。)至此,Integer = 20 这句代码执行完毕。紧接着看,bipush 把 10 压入栈asotre2 把变量 b 和栈中的 10 做关联(放到变量表中)

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

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

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

Integerc = null;Integerd =10;inte = 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工程师朋友们加入Java进阶高级架构:855355016

本群提供免费的学习指导 架构资料 以及免费的解答

不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导

相关文章

  • 一分钟理解Java包装类型

    Java 一直标榜自己是一个纯粹的面向对象语言,自作聪明的为所有的值类型都提供相应的引用类型(不明白这两个概念,看...

  • 常用类_包装类型

    java中有八种基本数据类型对应的包装类型:基本数据类型 包装类型byte :java.lang.Byte...

  • 007-014:关于包装类的面试题

    本文首发于公众号:javaadu 007:如何理解Java中的包装类? Java的类型系统由两部分组成:基本类型(...

  • JavaSE进阶五 包装类

    java中的包装类 java中对8种基本数据类型提供了8种包装类型;包装类是引用类型,父类是Object。 为什么...

  • Java中必须了解的常用类

    学习了解# Java中的包装类 Java中基本类型和包装类型之间的转换 Java中基本类型和字符串之间的转换 使用...

  • JAVA中的对象

    java8增强的包装类 java中基本数据类型不能当作对象类型变量使用的问题, java提供了包装类 (Wrapp...

  • [Java基础]包装类型

    [Java基础]包装类 了解一下 什么是包装类型在 Java 中, 数据类型总共可以分为2大类 : 基础数据类型和...

  • Kotlin与Java混合开发(1)✔️数据类型映射

    Java 基本数据类型 与 Kotlin 数据类型映射Java 包装类 与 Kotlin 数据类型映射Java 常...

  • 1.kotlin和Java基本数据类型

    一.基本数据类型 二.Java包装数据类型

  • Java面试题汇总

    1.java中包装类与引用类型_包装类型与引用类型的使用场景: https://blog.csdn.net/wei...

网友评论

    本文标题:一分钟理解Java包装类型

    本文链接:https://www.haomeiwen.com/subject/pqmsiftx.html