谈谈Java的自动装箱和拆箱
Java作为面向对象语言,有人认为所看到的都是对象,事实上,在Java SE 5之前,基本类型默认并不是采用对象存在的如果您想要把基本类型作为对象来处理,就必须自行转换,不过,在Java SE 5之后,为基本数据类型提供了自动装箱和拆箱功能,使得将基本类型转换为对象变得极其便捷。
- 在这里来捋一捋java的基本数据类型,不理不要紧,一理才发现俺也掌握的不是那么明确,在这里俺也再次学习下
- 总计有八个,分别是
- byte字节型(一个字节),char字符型(两个字节),short短整型(两个字节),int整型(四个字节),
- long长整型(八个字节),float浮点型(四个字节),double 双精度浮点型(八个字节),boolean型(一个字节)
在javase5之前,如果想要把基本数据类型作为对象来操作,就需要采用对应的对象,来把它们打包才行
现在虽然不用这样了,但其中也有一些要注意的地方,俺揪出来晒晒。
先说说类和对象,建立个概念吧先
- 类--可以认为是对象的设计图
- 对象--是按照设计图实现了的具体工具
- 先这么简单理解吧,如果真要扯开了说,那可是软件工程里面的一门专业课,我们有个概念就好
之所以要将基本类型数据打包成为对象,原因很简单,是因为对象可以携带更多的数据。
手动、自动装箱拆箱示例
Long,Integer,Double,Float,Boolean等等的类就是所谓的wrapper类,就跟wrapper这个单词所代表的意思一样,就是提供一个“包装,加壳”,把基本数据类型放在里面,来看代码,体会下先
- public class WrapperDemo{
- public staticvoid main(String[] args){
- int data1=21;
- int data2=24;
- //打包成为对象
- Integer data1Wrapper = new Integer(data1);
- Integer data2Wrapper = new Integer(data2);
- //原始数据直接除以3
- System.out.println(data1/3);
- //将数据打包,转换为double型,除以3
- System.out.println(data1Wrapper.doubleValue()/3);
- //比较
- System.out.println(data1Wrapper.compareTo(data2Wrapper));
- }
- }
图1-1 WrapperDemo的运行结果
通过上面的代码和运行结果,看到了将基本数据类型打包成为对象带来的好处了吧,别着急,这还只是javase5之前的做法,在javase5之后就已经支持自动装箱和拆箱了,在这,就不再单独写代码出来了,只写几个能说明问题的语句就可以了,相信很容易理解的。
- javase5之前,手动打包
- Integer data1 = new Integer(10);
- 事项将基本类型数据转换为对象
- javase5之后,支持自动打包
- Integer data1 = 10;
- 便可以实现将基本类型的数据转换为对象
- eg:
- 在上面的代码中,可以采用,可以直接进行两个基本数据类型的比较
- data1.compareTo(data2);
- 基本数据类型本身没有什么方法,当你运行之后会发现,它仍然可以正确运行,这就自动装箱和拆箱带来的好处
再来说说自动装箱拆箱
自动装箱和拆箱,从本质上讲,是编译器帮了我们的忙,这就是所谓的“编译器蜜糖”,既然这么好,是不是就可以放心的用了呢?
先别着急,喝口水,咱再接着唠
看看下面的情况,您是否了解
- Integer i = null;//表明i没有参考至任何对象
- int j = i ;//相当于 int j = i.intValue()
- 这样的代码,编译时是可以通过的,因为它的语法是正确的,但在运行时,就会排除NullPointerException错误,这是由于i并没有参考至任何对象造成的
- 个人建议,如果您对装箱拆箱不是理解的很清楚,***还是按部就班的一步一步的对它进行装包和拆包,这样,有的时候,可能会为你节省很多纠错的时间哦
还是自动装箱拆箱
- public class BoxDemo{
- public static void main(String[] args){
- Integer data1 = 500;
- Integer data2 = 500;
- System.out.println(data1==data2);
- }
- }
在你看到接下来的运行结果前,您先猜猜看,运行的结果会是怎样的呢?true or false?
图1-2 BoxDemo运行结果
false?没错,它就是false,自动装箱时,对于值从-128-127之间的数,被装箱后,会被放在内存中进行重用,
如果超出了这个值的范围就不会被重用的,所以每次new出来的都是一个新的对象,结果自然会是false。
- 在这里,区别一个概念“==”和equals()
- “==”是比较两个对象是不是引用自同一个对象。
- “equals()”是比较两个对象的内容。
- 这个一定得搞清楚,否则,在遇到问题的时候,可真是会让人抓狂的。
原文链接:http://blog.csdn.net/mlc0202/article/details/7393471
【编辑推荐】
相关文章
- Java要抛弃祖宗的基业,Java程序员危险了!
- 十大 Java 语言特性
- JVM 三色标记算法,原来是这么回事!
- 聊聊 Spring 事务控制策略以及 @Transactional 失效问题避坑
- 写给 Java 程序员的前端 Promise 教程
- 写给 Java 程序员的前端 Promise 教程,你学会了吗?
- Java 中为什么不全部使用 Static 方法?
- Java 池化技术你了解多少?
- Java 服务 Docker 容器化优秀实践
- Spring Boot + EasyExcel导入导出,简直太好用了!
- 我们一起聊聊 Java 内存泄漏
- CentOS 下安装 Docker 极简教程
- JDK 19 功能集冻结:Java 19 只有七个新特性
- 关于 CMS 垃圾回收器,你真的懂了吗?
- 为什么会有这么多编程语言?
- 改善Java代码的八个建议
- 接口流量突增,如何做好性能优化?
- Java 以编程方式创建JAR文件
- POJO、Java Bean是如何定义的
- Spring 的 Bean 明明设置了 Scope 为 Prototype,为什么还是只能获取到单例对象?