服务器出租网站模板,猎头公司怎么样,代表性设计制作作品图片,网站建设教程(任务2签订网站建设合同)题库转载自 一分钟理解Java包装类型
Java 一直标榜自己是一个纯粹的面向对象语言#xff0c;自作聪明的为所有的值类型都提供相应的引用类型#xff08;不明白这两个概念#xff0c;看之前的《一分钟理解传值和传引用》#xff09;比如#xff1a;int 类型对应的有 Integer自作聪明的为所有的值类型都提供相应的引用类型不明白这两个概念看之前的《一分钟理解传值和传引用》比如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 的包装数据类型非常蹩脚这是它为了追求“表面的面向对象”而付出的代价。装逼之势如雷霆万钧可怕。