自动装箱是 Java 编译器在基本类型和它们对应的包装类之间进行的自动转换。例如,将 int 类型转换为 Integer 类型,将 double 类型转换为 Double 型等等。如果转换以相反的方式进行,则称为开箱。// 包装类和基本数据类型的相互转换

下面是一个最简单的自动装箱例子:

Character ch = 'a';

例如,下面的代码:

List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)li.add(i);

尽管将 int 值作为基本类型而不是 Integer 对象添加到 li 列表,但是代码仍然可以编译。这里 li 是一个 Integer 对象的列表,而不是 int 值的列表,为什么 Java 编译器不会发出编译时错误呢?编译器之所以不会产生错误,是因为它从 i 创建了一个 Integer 对象,并将该对象添加到 li 列表。因此,编译器在运行时实际是将前面的代码转换为以下代码:

List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)li.add(Integer.valueOf(i));

在以下情况下,Java 编译器会对基本类型的值进行自动装箱:

  1. 把基本类型的值作为参数传递给需要相应包装类的对象的方法。
  2. 基本类型的值赋给相应包装类的变量。

接下来,思考一下下边的方法:

public static int sumEven(List<Integer> li) {int sum = 0;for (Integer i: li)if (i % 2 == 0)sum += i;return sum;
}

求余运算符 (%) 和一元运算符 (+=) 并不适用于 Integer 对象,但 Java 编译器在编译该方法时却不会产生任何错误,因为在调用 intValue() 方法时,Java 会将 Integer 转换为 int:

public static int sumEven(List<Integer> li) {int sum = 0;for (Integer i : li)if (i.intValue() % 2 == 0) //拆箱操作sum += i.intValue();return sum;
}

将包装类型(Integer)的对象转换为其对应的基本类型(int)称为拆箱。在以下情况下,Java 编译器会对包装类型的值进行自动拆箱:

  1. 把包装类型的值作为参数传递给需要相应基本类型的值的方法。
  2. 把包装类型的值赋值给相应基本类型的变量。

下边的例子展示了拆箱是如何工作的:

import java.util.ArrayList;
import java.util.List;public class Unboxing {public static void main(String[] args) {Integer i = new Integer(-8);// 1. 通过方法调用进行拆箱int absVal = absoluteValue(i);System.out.println("absolute value of " + i + " = " + absVal);List<Double> ld = new ArrayList<>();ld.add(3.1416);    // Π 通过方法调用自动装箱。// 2. 通过赋值进行拆箱double pi = ld.get(0);System.out.println("pi = " + pi);}public static int absoluteValue(int i) {return (i < 0) ? -i : i;}
}

该程序会打印以下内容:

absolute value of -8 = 8
pi = 3.1416

自动装箱和拆箱可以让开发人员编写更加清晰的代码,使代码更加易于阅读。下表列出了基本类型及其对应的包装类,Java 编译器会使用它们进行自动的装箱和拆箱:

基本类型 包装类型
boolean Boolean
byte Byte
char Character
float     Float
int     Integer
long     Long
short     Short
double     Double

至此,Java 中的自动装箱和拆箱介绍完毕。

Java 中的自动装箱和拆箱详解相关推荐

  1. Java中的自动装箱和拆箱

    自动装箱和拆箱 自动装箱和拆箱 自动装箱: 拆箱 1. 为什么要有包装类(或封装类) 2. 基本数据类型与对应的包装类: 3. 类型间的转换 4. 何时发生自动装箱和拆箱 赋值.数值运算时 方法调用时 ...

  2. 详解 Java 中的自动装箱与拆箱

    点击上方 Java后端,选择 设为星标 优质文章,及时送达 什么是自动装箱拆箱?很简单,下面两句代码就可以看到装箱和拆箱过程 //自动装箱 Integer total = 99; //自动拆箱 int ...

  3. java的自动装箱和拆箱,Java中的自动装箱和拆箱是什么?

    当我们用任何语言编写程序时,大多数时候我们使用原始数据类型,.但是,在面向对象编程领域,有些情况下原始数据类型会出现不足,而Java就是其中之一.为了克服原始数据类型的缺点,我们 当我们用任何语言编写 ...

  4. java装箱拆箱_Java中的自动装箱与拆箱

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

  5. Java™ 教程(自动装箱和拆箱)

    自动装箱和拆箱 自动装箱是Java编译器在基元类型和相应的对象包装类之间进行的自动转换,例如,将int转换为Integer,将double转换为Double,依此类推,如果转换是另一种方式,则称为拆箱 ...

  6. Java包装类及自动装箱、拆箱

    Java包装类 基本类型 大小 包装器类型 boolean / Boolean char 16bit Character byte 8bit Byte short /16bit Short int 3 ...

  7. java中的装箱和拆箱详解

    什么是装箱和拆箱 装箱就是自动将基本数据类型转换为包装器类型. 拆箱就是自动将包装器类型转换为基本数据类型. 装箱和拆箱的原理 自动装箱都是通过包装类的 valueOf() 方法来实现的.自动拆箱都是 ...

  8. java+包装类,装箱和拆箱_Java包装类,装箱和拆箱详解

    下面要给大家讲到的就是Java内置包装类方面的知识,这章主要会讲到Java包装类装箱和拆箱方面的知识,一起来了解一下. Java为每种基本数据类型分别设计了对应的类,这就被叫做是包装类(Wrapper ...

  9. C#中定义装箱和拆箱详解

    1. C#装箱和拆箱是一个抽象的概念. 2. C#装箱是将值类型转换为引用类型:拆箱是将引用类型转换为值类型. 利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与 ...

最新文章

  1. Android远程服务与本地服务的特点以及功能差异
  2. 常见的几种内排序算法以及实现(C语言)(转)
  3. 非IE浏览器下让界面变灰色
  4. 全球及中国树脂晶圆切割刀片行业需求状况及竞争前景分析报告2021-2027年
  5. vue 导出excel表格-乱码问题
  6. 命令创建vue项目工程
  7. mma7660(重力感应传感器)
  8. 遇到问题---linux--crontab输出重定向不生效最全可能原因收集和解决
  9. 【笔记】研究生的早期科研之路(作者:中国人民大学 赵鑫)
  10. upload-labs攻略
  11. 法拉克机器人自动怎么调_FANUC机器人:参考位置功能介绍与设定方法
  12. 中图杯获奖作品计算机组,“中图杯”第十四届环境地图大赛召开 地图慧成指定制图软件...
  13. 保护眼睛的屏幕设置 Win2008R2中的Win7桌面效果设置
  14. 在vue项目中使用html2canvas截图(固定区域截图)
  15. 北科大协同中心计算机,2021考研调剂:北科大钢铁共性技术协同创新中心公告
  16. Java封装libfacedetection做人脸检测
  17. 1.项目介绍——毕业设计之论坛项目
  18. Python直男作死篇:生日蛋糕小游戏
  19. 【攻略】如何用云服务器实现云搬砖
  20. DAS\NAS\SAN\IPSAN区别

热门文章

  1. 简述胶球清洗装置的工作原理(附安装示意图)
  2. 功能强大的离线浏览器(3)
  3. 服务器远程监控管理(四)-统一监控管理
  4. velocity官网介绍
  5. linux中安装libreoffice的简单方法
  6. 申请CA证书的费用大概是多少
  7. IP-GUARD如何同步AD域账号(导入AD域功能使用说明)
  8. python mk检验_python mk趋势检验的实现
  9. 13.Redis系列之布隆过滤器
  10. [Android] Android Badge技术分析