自动装箱和拆箱

自动装箱是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,但代码会进行编译,因为liInteger对象的列表,而不是int值列表,你可能想知道为什么Java编译器不会发出编译时错误,编译器不会生成错误,因为它从i创建一个Integer对象并将该对象添加到li,因此,编译器在运行时将前面的代码转换为以下代码:

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

将原始值(例如int)转换为相应包装类(Integer)的对象称为自动装箱,Java编译器应用自动装箱,当原始值是:

  • 作为参数传递给期望相应包装类的对象的方法。
  • 分配给相应包装类的变量。

考虑以下方法:

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方法将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编译器应用拆箱,当包装类的对象是:

  • 作为参数传递给期望相应基元类型的值的方法。
  • 分配给相应基元类型的变量。

Unboxing示例显示了其工作原理:

import java.util.ArrayList;
import java.util.List;public class Unboxing {public static void main(String[] args) {Integer i = new Integer(-8);// 1. Unboxing through method invocationint absVal = absoluteValue(i);System.out.println("absolute value of " + i + " = " + absVal);List<Double> ld = new ArrayList<>();ld.add(3.1416);    // Π is autoboxed through method invocation.// 2. Unboxing through assignmentdouble 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

上一篇:StringBuilder类

下一篇:为什么要使用泛型?

Java™ 教程(自动装箱和拆箱)相关推荐

  1. Java的自动装箱与拆箱详细分析

    Java的自动装箱与拆箱详细分析 1. 既然说是装箱与拆箱,那么到底是装的什么,拆的什么? 装箱:将基本数据类型封装起来,用他对应的引用类(包装类)来处理 拆箱:就是把引用类里面的基本数据拆出来 2. ...

  2. java中的拆箱和装箱是指什么_一文带你理解Java中自动装箱和拆箱

    Java中自动装箱和拆箱 装箱(Boxing),也称为包装(Wrapper),是在对象中放置原语类型(primitive type)的过程,以便原语(primitive)可以作为引用对象使用. 这里的 ...

  3. 一文带你理解Java中自动装箱和拆箱

    Java中自动装箱和拆箱 装箱(Boxing),也称为包装(Wrapper),是在对象中放置原语类型(primitive type)的过程,以便原语(primitive)可以作为引用对象使用. 这里的 ...

  4. 详解Java的自动装箱与拆箱(Autoboxing and unboxing)

    一.什么是自动装箱拆箱 很简单,下面两句代码就可以看到装箱和拆箱过程 //自动装箱 Integer total = 99;//自定拆箱 int totalprim = total; 简单一点说,装箱就 ...

  5. java装箱_谈谈Java的自动装箱和拆箱

    Java作为面向对象语言,有人认为所看到的都是对象,事实上,在Java SE 5之前,基本类型默认并不是采用对象存在的如果您想要把基本类型作为对象来处理,就必须自行转换,不过,在Java SE 5之后 ...

  6. Java之自动装箱与拆箱

    什么是自动装箱与拆箱 1,来由 Java是一种面向对象编程的语言,但他同时也提供了基本数据类型,提供基本数据类型是出于性能方面的考虑:因为使用对象来处理即使是最简单的计算,系统也销也比较大. Java ...

  7. [Java基础]自动装箱和拆箱

    自动装箱和拆箱:

  8. Java 包装类 自动装箱和拆箱

    包装类(Wrapper Class) 包装类是针对于原生数据类型的包装. 因为有8个原生数据类型,所以对应有8个包装类. 所有的包装类(8个)都位于java.lang下. Java中的8个包装类分别是 ...

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

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

  10. Java的自动装箱与拆箱

    为什么80%的码农都做不了架构师?>>>    public class Test {public static void main(String[] args) {Integer ...

最新文章

  1. 软件开发详细设计说明书_汽车软件开发之ASPICE系统需求过程组
  2. easyui 中combogrid 实现多选,反选效果
  3. 【机器学习】XGBoost学习笔记
  4. CTF【解密】字符串flag被加密成已知新字符串,请解密出flag,可以使用Python解码出WriteUp
  5. BOM函数之history对象
  6. 2018.09.24 codeforces 1053C. Putting Boxes Together(线段树)
  7. iOS之基于FreeStreamer的简单音乐播放器(模仿QQ音乐)
  8. 网站Banner图切换效果(flash)
  9. NLog.config
  10. window下c语言c s通信,c++ Windows Socket实现最简单的C/S网络通信(TCP)
  11. soapui使用教程1-基本使用和录制
  12. Python:用类与对象写一元二次方程计算器中遇到的错误
  13. excel随机数_【收藏】Excel生成随机数、不重复随机数技巧,试验检测办公必备...
  14. Win10设置每天定时运行某程序
  15. CuPy is not correctly installed
  16. Windows 10 中的恢复选项
  17. 笔记本电脑外接显示器无信号 其实是主板静电积压 完全可以不拆机放电
  18. 中标麒麟操作系统安装MySQL5.7.22
  19. Linux 系统裁剪笔记 软盘2
  20. Markdown - 做好看的笔记

热门文章

  1. 配置windows 2008 作为远程访问SSL-×××服务器系列之二
  2. Android实现仿美图秀秀给图片加框
  3. AndroidStudio Gradle自定义属性xmlns无法识别
  4. android 保存ArrayListObject至SharedPreferences
  5. Java方法 signature
  6. Eclipse没有server 配置Tomcat
  7. Myeclipse使用DB Browser连接数据库错误:OPTION SQL_SELECT_LIMIT=DEFAULT
  8. C# 窗口最大化但不占用任务栏位置
  9. windows server 2008 r2 IIS PHP
  10. mapper代理(十一)