热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

说说java的自动装箱(autoboxing)和拆箱(unboxing

Adversitymakesamanwise,notrich.逆境出人才java作为面向对象语言,有人认为所看到的都是对象,事实上,在javase5之前,基本类型默认并不是采用对象存在的
Adversity makes a man wise, not rich. 逆境出人才

java作为面向对象语言,有人认为所看到的都是对象,事实上,在javase5之前,基本类型默认并不是采用对象存在的如果您想要把基本类型作为对象来处理,就必须自行转换,不过,在javase5之后,为基本数据类型提供了自动装箱和拆箱功能,使得将基本类型转换为对象变得极其便捷。

Java代码
  1. 在这里来捋一捋java的基本数据类型,不理不要紧,一理才发现俺也掌握的不是那么明确,在这里俺也再次学习下 
  2. 总计有八个,分别是 
  3. byte字节型(一个字节),char字符型(两个字节),short短整型(两个字节),int整型(四个字节), 
  4. long长整型(八个字节),float浮点型(四个字节),double 双精度浮点型(八个字节),boolean型(一个字节) 
在这里来捋一捋java的基本数据类型,不理不要紧,一理才发现俺也掌握的不是那么明确,在这里俺也再次学习下
总计有八个,分别是
byte字节型(一个字节),char字符型(两个字节),short短整型(两个字节),int整型(四个字节),
long长整型(八个字节),float浮点型(四个字节),double 双精度浮点型(八个字节),boolean型(一个字节)

在javase5之前,如果想要把基本数据类型作为对象来操作,就需要采用对应的对象,来把它们打包才行

现在虽然不用这样了,但其中也有一些要注意的地方,俺揪出来晒晒

   先说说类和对象,建立个概念吧先

Java代码
  1. 类--可以认为是对象的设计图 
  2. 对象--是按照设计图实现了的具体工具 
  3. 先这么简单理解吧,如果真要扯开了说,那可是软件工程里面的一门专业课,我们有个概念就好 
类--可以认为是对象的设计图
对象--是按照设计图实现了的具体工具
先这么简单理解吧,如果真要扯开了说,那可是软件工程里面的一门专业课,我们有个概念就好

    之所以要将基本类型数据打包成为对象,原因很简单,是因为对象可以携带更多的数据

手动、自动装箱拆箱示例

    Long,Integer,Double,Float,Boolean等等的类就是所谓的wrapper类,就跟wrapper这个单词所代表的意思一样,就是提供一个“包装,加壳”,把基本数据类型放在里面,来看代码,体会下先

Java代码
  1. public class WrapperDemo{ 
  2.     public staticvoid main(String[] args){ 
  3.          int data1=21
  4.          int data2=24
  5.          //打包成为对象 
  6.          Integer data1Wrapper = new Integer(data1); 
  7.          Integer data2Wrapper = new Integer(data2); 
  8.          //原始数据直接除以3 
  9.          System.out.println(data1/3); 
  10.          //将数据打包,转换为double型,除以3 
  11.          System.out.println(data1Wrapper.doubleValue()/3); 
  12.         //比较 
  13.         System.out.println(data1Wrapper.compareTo(data2Wrapper)); 
  14.     } 
  15.  
public class WrapperDemo{
public static void 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的运行结果

   
  
       图1-1  WrapperDemo的运行结果

  通过上面的代码和运行结果,看到了将基本数据类型打包成为对象带来的好处了吧,别着急,这还只是javase5之前的做法,在javase5之后就已经支持自动装箱和拆箱了

,在这,就不再单独写代码出来了,只写几个能说明问题的语句就可以了,相信很容易理解的

Java代码
  1. javase5之前,手动打包 
  2. Integer data1 = new Integer(10); 
  3. 事项将基本类型数据转换为对象 
  4. javase5之后,支持自动打包 
  5. Integer data1 = 10; 
  6. 便可以实现将基本类型的数据转换为对象 
  7. eg: 
  8.     在上面的代码中,可以采用,可以直接进行两个基本数据类型的比较 
  9.     data1.compareTo(data2); 
  10.    基本数据类型本身没有什么方法,当你运行之后会发现,它仍然可以正确运行,这就自动装箱和拆箱带来的好处 
javase5之前,手动打包
Integer data1 = new Integer(10);
事项将基本类型数据转换为对象
javase5之后,支持自动打包
Integer data1 = 10;
便可以实现将基本类型的数据转换为对象
eg:
在上面的代码中,可以采用,可以直接进行两个基本数据类型的比较
data1.compareTo(data2);
基本数据类型本身没有什么方法,当你运行之后会发现,它仍然可以正确运行,这就自动装箱和拆箱带来的好处

再来说说自动装箱拆箱

    自动装箱和拆箱,从本质上讲,是编译器帮了我们的忙,这就是所谓的“编译器蜜糖”,既然这么好,是不是就可以放心的用了呢?

先别着急,喝口水,咱再接着唠

    看看下面的情况,您是否了解

Java代码
  1. Integer i = null;//表明i没有参考至任何对象 
  2. int j = i ;//相当于 int j = i.intValue() 
  3. 这样的代码,编译时是可以通过的,因为它的语法是正确的,但在运行时,就会排除NullPointerException错误,这是由于i并没有参考至任何对象造成的 
Integer i = null;//表明i没有参考至任何对象
int j = i ;//相当于 int j = i.intValue()
这样的代码,编译时是可以通过的,因为它的语法是正确的,但在运行时,就会排除NullPointerException错误,这是由于i并没有参考至任何对象造成的
Java代码
  1. 个人建议,如果您对装箱拆箱不是理解的很清楚,最好还是按部就班的一步一步的对它进行装包和拆包,这样,有的时候,可能会为你节省很多纠错的时间哦 
个人建议,如果您对装箱拆箱不是理解的很清楚,最好还是按部就班的一步一步的对它进行装包和拆包,这样,有的时候,可能会为你节省很多纠错的时间哦

还是自动装箱拆箱

Java代码
  1. public class BoxDemo{ 
  2.    public staticvoid main(String[] args){ 
  3.     Integer data1 = 500
  4.     Integer data2 = 500
  5.     System.out.println(data1==data2); 
  6.    } 
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是代码运行的结果

 
  
              图1-2  BoxDemo运行结果

   false?没错,它就是false,自动装箱时,对于值从-128-127之间的数,被装箱后,会被放在内存中进行重用,

如果超出了这个值的范围就不会被重用的,所以每次new出来的都是一个新的对象,结果自然会是false

Java代码
  1. 在这里,区别一个概念“==”和equals() 
  2.     “==”是比较两个对象是不是引用自同一个对象 
  3.      “equals()”是比较两个对象的内容 
  4. 这个一定得搞清楚,否则,在遇到问题的时候,可真是会让人抓狂的 

推荐阅读
  • java布尔字段用is前缀_POJO类中布尔类型的变量都不要加is前缀详解
    前言对应阿里巴巴开发手册第一章的命名风格的第八条。【强制】POJO类中布尔类型的变量都不要加is前缀,否则部分框架解析会引起序列化错误。反例:定义为基本 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 一、MyEclipse中的一些常用的快捷键:ctrl+shift+x大写ctrl+shift+y小写alt+内容提示写住方法的时候可以先写main然后按alt+就可以了ctrl+1 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 判断编码是否可立即解码的程序及电话号码一致性判断程序
    本文介绍了两个编程题目,一个是判断编码是否可立即解码的程序,另一个是判断电话号码一致性的程序。对于第一个题目,给出一组二进制编码,判断是否存在一个编码是另一个编码的前缀,如果不存在则称为可立即解码的编码。对于第二个题目,给出一些电话号码,判断是否存在一个号码是另一个号码的前缀,如果不存在则说明这些号码是一致的。两个题目的解法类似,都使用了树的数据结构来实现。 ... [详细]
  • WPF之Binding初探
      初学wpf,经常被Binding搞晕,以下记录写Binding的基础。首先,盗用张图。这图形象的说明了Binding的机理。对于Binding,意思是数据绑定,基本用法是:1、 ... [详细]
  • 获取时间的函数js代码,js获取时区代码
    本文目录一览:1、js获取服务器时间(动态)2 ... [详细]
  • fzu 1715 Ball and Box n个不同的求放到m个不同的盒子中方法的个数
    1715BallandBoxAccept:120Submit:288TimeLimit:1000mSecMemoryLimit:32768KBProblem ... [详细]
  • ProblemDescriptionXiaoAlivesinavillage.Lastyearfloodrainedthevillage ... [详细]
  • PrivateConstLF_FACESIZE32PrivateConstCF_PRINTERFONTS&H2PrivateConstCF_SCREENFONTS ... [详细]
author-avatar
书友34043247
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有