这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆:

java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装箱,解包装称为拆箱);

其实按照我自己的理解自动装箱就可以简单的理解为将基本数据类型封装为对象类型,来符合java的面向对象;例如用int来举例:

//声明一个Integer对象

Integer num = 10;

//以上的声明就是用到了自动的装箱:解析为

Integer num = new Integer(10);以上就是一个很好的体现,因为10是属于基本数据类型的,原则上它是不能直接赋值给一个对象Integer的,但jdk1.5后你就可以进行这样的声明,这就是自动装箱的魅力

自动将基本数据类型转化为对应的封装类型。成为一个对象以后就可以调用对象所声明的所有的方法

自动拆箱:故名思议就是将对象重新转化为基本数据类型:

//装箱

Integer num = 10;

//拆箱

int num1 = num;自动拆箱有个很典型的用法就是在进行运算的时候:因为对象时不恩直接进行运算的,而是要转化为基本数据类型后才能进行加减乘除

Integer num = 10;

//进行计算时隐含的有自动拆箱

System.out.print(num--);哈哈 应该感觉很简单吧,下面我再来讲点稍微难点的,

//在-128~127 之外的数

Integer num1 = 297; Integer num2 = 297;

System.out.println("num1==num2: "+(num1==num2));

// 在-128~127 之内的数

Integer num3 = 97; Integer num4 = 97;

System.out.println("num3==num4: "+(num3==num4)); 打印的结果是:num1==num2: false num3==num4: true

很奇怪吧:这就归结于java对于Integer与int的自动装箱与拆箱的设计,是一种模式:叫享元模式(flyweight)

为了加大对简单数字的重利用,java定义:在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象

而如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象;明白了吧

以上的现象是由于使用了自动装箱所引起的,如果你没有使用自动装箱,而是跟一般类一样,用new来进行实例化,就会每次new就都一个新的对象;

这个的自动装箱拆箱不仅在基本数据类型中有应用,在String类中也有应用,比如我们经常声明一个String对象时:

String str = "sl";

//代替下面的声明方式

String str = new String("sl");

基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。虽然为您打包基本数据类型提供了方便,但提供方便的同时表示隐藏了细节,建议在能够区分基本数据类型与对象的差别时再使用。

autoboxing和unboxing

在Java中,所有要处理的东西几乎都是对象 (Object),例如之前所使用的Scanner是对象,字符串(String)也是对象,之后还会看到更多的对象。然而基本(Primitive)数据类型不是对象,也就是您使用int、double、boolean等定义的变量,以及您在中直接写下的字面常量。

在前一个小节中已经大致看到了操作对象的方便性,而使用Java有一段时间的人都知道,有时需要将基本数据类型转换为对象。例如使用Map对象要put()方法时,需要传入的参数是对象而不是基本数据类型。

要使用打包类型(Wrapper Types)才能将基本数据类型包装为对象,前一个小节中您已经知道在J2SE 5.0之前,要使用以下语句才能将int包装为一个Integer对象:Integer integer = new Integer(10);

在 J2SE 5.0之后提供了自动装箱的功能,您可以直接使用以下语句来打包基本数据类型:Integer integer = 10;

在进行编译时,编译器再自动根据您写下的语句,判断是否进行自动装箱动作。在上例中integer参考的会是Integer类的实例。同样的动作可以适用于 boolean、byte、short、char、long、float、double等基本数据类型,分别会使用对应的打包类型(Wrapper Types)Boolean、Byte、Short、Character、Long、Float或Double。下面直接使用自动装箱功能来改写范例 4.4。

范例4.5 AutoBoxDemo.java

public class AutoBoxDemo {

public static void main(String[] args) {

Integer data1 = 10;

Integer data2 = 20;

// 转为double值再除以3

System.out.println(data1.doubleValue() / 3);

// 进行两个值的比较

System.out.println(data1.compareTo(data2));

}

}

程序看来简洁了许多,data1与data2在运行时就是Integer的实例,可以直接进行对象操作。的结果如下:

3.3333333333333335

–1

自动装箱运用的方法还可以如下:

int i = 10;

Integer integer = i;

也可以使用更一般化的java.lang.Number类来自动装箱。例如:

Number number = 3.14f;

3.14f会先被自动装箱为Float,然后指定给number。

从J2SE 5.0开始可以自动装箱,也可以自动拆箱(unboxing),也就是将对象中的基本数据形态信息从对象中自动取出。例如下面这样写是可以的:

复制代码代码如下:

Integer fooInteger = 10;

int fooPrimitive = fooInteger;

fooInteger引用至自动装箱为Integer的实例后,如果被指定给一个int类型的变量fooPrimitive,则会自动变为int类型再指定给fooPrimitive。在运算时,也可以进行自动装箱与拆箱。例如:

复制代码代码如下:

Integer i = 10;

System.out.println(i + 10);

System.out.println(i++);

上例中会显示20与10,编译器会自动进行自动装箱与拆箱,也就是10会先被装箱,然后在i + 10时会先拆箱,进行加法运算;i++该行也是先拆箱再进行递增运算。再来看一个例子:

复制代码代码如下:

Boolean boo = true;

System.out.println(boo && false);

同样的boo原来是Boolean的实例,在进行AND运算时,会先将boo拆箱,再与false进行AND运算,结果会显示false。

//

装箱:从基本类型转换成Object类型,称之为装箱;***拆箱:从Object转换乘基本类型的操作,称之为拆箱。 这个操作在反射过程中用的比较的多。

装箱:在堆中建立一个Object实例,把你指定的值复制进去;***拆箱:判别引用指向的堆中信息是否是要拆成的类型,是取出堆中值送给栈中变量,否则报异常

///

装箱是值类型到object类型或到该值类型所实现的任何接口类型的隐士转换。

将一个值类型装箱会分配一个对象实例并将该值复制到新的对象中。

int i=123;

object o=i;

这句话的结果是在堆栈上创建一个对象o,而该对象在堆上引用int类型的值。该值是赋值给变量i

的值类型值的一个副本。

下面是显示执行装箱转换

复制代码代码如下:

int i=123;

ojbect o=(object)i;

此例将整数变量i通过装箱转换为对象o。这样,存储在变量i中的值就从123改为456。此例显示对象保留了内容的原始副本。即123。

取消装箱是从object类型到值类型或从接口类型到实现该接口的值类型的显示转换。取消装箱操作包括:

检查对象实例,确保它是给定值类型的一个装箱值。

将该值从实例复制到值类型变量中。

例子:

int i=123;

object box=i;

int j=(int)box;

java装箱和拆箱_java自动装箱和拆箱相关推荐

  1. java 拆箱_Java自动装箱拆箱

    一.装箱.拆箱定义 如果一个int型量被传递到需要一个Integer对象的地方,那么,编译器将在幕后插入一个对Integer构造方法的调用,这就叫做自动装箱.而如果一个Integer对象被放到需要in ...

  2. java 自动装箱拆箱_java——自动装箱拆箱

    讲一下JDK 5 引入的自动装箱与拆箱 自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象.自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使 ...

  3. java中为什么自动装箱拆箱_Java自动装箱和自动拆箱的理解

    Java自动装箱和自动拆箱的理解 1.代码 public class AutoBoxing { public static void main(String[] args) { Integer a = ...

  4. java 自动拆箱_Java 自动装箱 和 自动拆箱

    自动装箱:/** * 实际上,程序运行时,系统为我们执行了下面一条语句: * Integer number = new Integer(290); */ Integer number = 290; S ...

  5. java 包装类缺点_Java 自动拆箱和自动装箱学习笔记

    Java 自动拆箱和自动装箱学习笔记 详情参考以下 1. 概述 Java 中的自动装箱和自动拆箱算是一种语法糖,也就是在编译阶段编译器在合适的情况下帮我们的做了自动拆箱和自动装箱. 众所周知,Java ...

  6. Java进阶之自动拆箱与自动装箱

    序. java基本类型介绍 java中,基本数据类型一共有8种,详细信息如下表: 类型 大小 范围 默认值 byte 8 -128 - 127 0 short 16 -32768 - 32768 0 ...

  7. 如何理解Java中的自动拆箱和自动装箱?

    小伟刚毕业时面的第一家公司就被面试官给问住了,记忆尤深啊- 如何理解Java中的自动拆箱和自动装箱? 自动拆箱?自动装箱?什么鬼,听都没听过啊,这-这-知识盲区- 回到家后小伟赶紧查资料,我透,这不就 ...

  8. 如何理解Java自动装箱_如何理解Java中的自动拆箱和自动装箱?

    如何理解Java中的自动拆箱和自动装箱? 自动拆箱?自动装箱?什么鬼,听都没听过啊,这...这..知识盲区... 回到家后小伟赶紧查资料,我透,这不就是问基本类型跟封装类型吗,面试官整啥名词呢... ...

  9. 什么是自动拆箱和自动装箱

    什么是自动拆箱和自动装箱 Java中基本类型有八种,可以分为四类: 整形: byte(一个字节来存储,范围为-2^7- 2^7-1), short (两个字节来存储,范围为-2^15- 2^15-1) ...

最新文章

  1. 优化JavaScript代码
  2. 灵活而又可怕的params参数数组
  3. 引号不是字符串中唯一的可以被转义字符。下面是常见的转义序列列表:
  4. Happy 牛 Year!牛年dotnet云原生技术趋势
  5. Process, Thread, STA, MTA, COM object
  6. 嵌入式Linux驱动笔记--转自风筝丶
  7. paip.php调试imcompatible debug sever version..with zend debugger
  8. AFD-0654: AFD is not supported on Exadata systems CRS-10001: Errors xxx.ko was not found
  9. 项目启动报错:Caused by: com.atomikos.recovery.LogException: Log already in use? tmlog in ./
  10. 酒店PMS变革之路:开放互联、模块化配置
  11. Bootstrap3和Bootstrap4区别
  12. vivo手机系统android9,vivo终于推送Android9.0,这几款机型你有吗?V粉们已经迫不及...
  13. 共享美容院营销新概念与盈利模式
  14. 什么是 DNS? | DNS 的工作方式
  15. jQuery unload事件
  16. 【论文研读】基于BP 神经网络的 Q235 钢力学性能预测模型
  17. win10网上邻居无法访问0x80004005
  18. 赚商联盟:知识付费时代通过购买网课来缓解焦虑,是对还是错?
  19. rkmedia 调试笔记
  20. UVM-1.1学习(二)——uvm_cmdline_processor

热门文章

  1. 服务器虚拟多台linux,VirtualBox环境下基于多台Ubuntu虚拟机的Hadoop分布式计算环境搭建...
  2. apache phoenix 入门_实现Phoenix入门
  3. linux中配置phpcms v9 中的sphinx
  4. 淘宝首页的HTML以及CSS技术点
  5. 织梦DEDE网站后台如何上传附件
  6. swagger2 分组
  7. 聊聊并发(四)——深入分析ConcurrentHashMap
  8. dentity在Java里是什么意思_注释@Id和@GeneratedValue(strategy = GenerationType.IDENTITY)的用途是什么?为什么世代类型是身份?...
  9. 广西2021普通高考成绩查询,2021广西高考成绩什么时候出
  10. 0网卡开启_中标麒麟Linux v7系统下设置双网卡bond或team绑定详细过程