深入浅出 Java 中的包装类

转载自   深入浅出 Java 中的包装类

前阵子,我们分享了《Java中的基本数据类型转换》这篇文章,对许多粉丝还是有带来帮助的,今天讲一下 Java 包装类的的由来,及自动装箱、拆箱的概念和原理。

什么是包装类型

Java 设计当初就提供了 8 种 基本数据类型及对应的 8 种包装数据类型。我们知道 Java 是一种面向对象编程的高级语言,所以包装类型正是为了解决基本数据类型无法面向对象编程所提供的。

下面是基本数据类型与对应的包装类型。

基本数据类型包装类型
byteByte
booleanBoolean
shortShort
charCharacter
intInteger
longLong
floatFloat
doubleDouble

下面是包装类型的继承结构图。

 

 

从以上图表可以对基本类型和包装类型有一个全面的了解。

包装类应用场景

1、集合类泛型只能是包装类;

// 编译报错
List<int> list1 = new ArrayList<>();// 正常
List<Integer> list2 = new ArrayList<>();

2、成员变量不能有默认值;

private int status;

基本数据类型的成员变量都有默认值,如以上代码 status 默认值为 0,如果定义中 0 代表失败,那样就会有问题,这样只能使用包装类 Integer,它的默认值为 null,所以就不会有默认值影响。

3、方法参数允许定义空值;

private static void test1(int status){System.out.println(status);
}

看以上代码,方法参数定义的是基本数据类型 int,所以必须得传一个数字过来,不能传 null,很多场合我们希望是能传递 null 的,所以这种场合用包装类比较合适。

还有更多应用场景就不一一例举了,欢迎留言共同探讨包装类的更多的应用场景。

自动装箱、拆箱

Java 5 增加了自动装箱、拆箱机制,提供基本数据类型和包装类型的相互转换操作。

自动装箱

自动装箱即自动将基本数据类型转换成包装类型,在 Java 5 之前,要将基本数据类型转换成包装类型只能这样做,看下面的代码。

Integer i1 = new Integer(8);Integer i2 = Integer.valueOf(8);// 自动装箱
Integer i3 = 8;

以上 3 种都可以进行转换,但在 Java 5 之前第 3 种方法是编译失败的,第 3 种方法也正是现在的自动装箱功能。另外,第一种构造器方法也不推荐使用了,已经标为废弃了。

其实自动装箱的原理就是调用包装类的 valueOf 方法,如第 2 个方法中的 Integer.valueOf 方法。

自动拆箱

自动拆箱即自动将包装类型转换成基本数据类型,与自动装箱相反,有装就有拆,很好理解。

// 自动拆箱
int i4 = i3;int i5 = i3.intValue();

继续上面的例子,把 i3 赋值给 i4 就是实现的自动拆箱功能,自动装箱的原理就是调用包装类的 xxValue 方法,如 i5 中的 Integer 的 intValue 方法。

自动装箱、拆箱不只是体现在以上的例子,在方法接收参数、对象设置参数时都能自动装箱拆箱。

需要注意的是,关于 Integer,-128 ~ 127 会有缓存,对比这个范围的值的对象是一个坑,这个在阿里巴巴规范中也有提及。 详细请参考《IntegerCache的妙用和陷阱》这篇文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中实现将一个数字字符串转换成逗号分隔的数字串, 即从右边开始每三个数字用逗号分隔

源代码如下&#xff1a; /*将一个数字字符串转换成逗号分隔的数字串&#xff0c;即从右边开始每三个数字用逗号分隔 */public static void testFenGeNumber(){String number "1235954";StringBuffer sb new StringBuffer(number);for(int i number.length()-3;i&g…

事件总线(Event Bus)知多少

1. 引言 事件总线这个概念对你来说可能很陌生&#xff0c;但提到观察者&#xff08;发布-订阅&#xff09;模式&#xff0c;你也许就很熟悉。事件总线是对发布-订阅模式的一种实现。它是一种集中式事件处理机制&#xff0c;允许不同的组件之间进行彼此通信而又不需要相互依赖&…

影响程序员生涯的三个错误观念,你千万不要犯

转载自 影响程序员生涯的三个错误观念&#xff0c;你千万不要犯 程序员在社会上&#xff0c;到底是怎样一个生活群体&#xff1f;是否能找到自己方向&#xff1f;其实&#xff0c;路一直都在那里&#xff0c;只是你看不到而已&#xff01; 当初的你&#xff0c;可能一直被一…

用 docker secrets 保存 appsettings.Production.json

这是我们使用阿里云容器服务基于 docker 容器部署 asp.net core 应用遇到的另一个问题 —— 如果将包含敏感信息的应用配置文件 appsettings.Production.json 传递给运行在容器中的 asp.net core 应用。 Docker 针对这样的应用场景已经提供了解决方案 —— Docker Secrets&…

人脸识别简要说明

近日&#xff0c;或许是毕业季来临&#xff0c;或许是研究人脸识别的同行增多。总之&#xff0c;通过博客找我的人可所谓“络绎不绝”。 这几年来&#xff0c;自己不断的抽些碎片时间&#xff0c;整理出来的人脸识别各个版本&#xff0c;于2017年9月26日发布的java的第一个版本…

读《代码不朽:编写可维护软件的10大要则》C# 版

这本书特别针对没有接受过计算机科学或软件工程专业学习的软件开发人员&#xff0c;这类人员除了熟悉所用语言语法和语义之外&#xff0c;很少接受其他专业培训&#xff0c;对软件工程中的一些概念理解欠缺。软件设计方面考虑较少。如果要成为一个专业的程序员&#xff0c;就需…

mysql多表查询的分类

内连接 等值连接 非等值连接 自连接 外连接 inner join 等值连接 非等值连接 自连接 外连接

再有人问你volatile是什么,把这篇文章也发给他(深入分析)

转载自 再有人问你volatile是什么&#xff0c;把这篇文章也发给他 在上一篇文章中&#xff0c;我们围绕volatile关键字做了很多阐述&#xff0c;主要介绍了volatile的用法、原理以及特性。在上一篇文章中&#xff0c;我提到过&#xff1a;volatile只能保证可见性和有序性&…

Cockroach DB 1.0发布

分布式SQL数据库Cockroach DB遵循软件产品以动物命名的模式。近日&#xff0c;该数据库的第一个生产就绪版本1.0发布。 许多人将Cockroach DB视为Google Spanner的开源版本。后者是一个强一致性、横向可扩展的RDBMS&#xff0c;它起初是一个服务于谷歌服务的内部项目&#xff…

分享10道常考Java面试题及答案

转载自 分享10道常考Java面试题及答案 Hi&#xff0c;大家好&#xff0c;今天给大家分享10道常考的Java面试题及答案&#xff0c;涉及到Java中的10个方面。每个领域一道题。希望你能有收获。 <面向对象>什么是面向对象&#xff1f;什么是面向过程&#xff1f;面型对象…

对数据进行插入操作并且获取主键的值

eg. eg:工作中写定时模块&#xff0c;先插入时间段&#xff0c;然后直接获取id

编写高性能 .NET 代码 第二章:垃圾回收 基本操作

基本操作 垃圾回收的算法细节还在不断完善中&#xff0c;性能还会有进一步的提升。下文介绍的内容在不同的.NET版本里会略有不同&#xff0c;但大方向是不会有变动的。 在.net进程里会管理2个类型的内存堆&#xff1a;托管和非托管。本地代码申请的&#xff0c;以及由CLR申请…

如何设计一个高可用的运营系统

转载自 如何设计一个高可用的运营系统 这是一篇来自粉丝的投稿&#xff0c;作者【林湾村龙猫】近一年在做关于运营活动方面的设计。本文是他的关于运营活动的总结&#xff0c;Hollis做了一点点修改。 概述 一个产品业务的发展总是离不开运营二字。随着业务快速的发展以及新…

.Net中的AOP系列之《AOP实现类型》

本系列的实验环境&#xff1a;VS 2017。 读完本章后&#xff0c;可能仍然不能实现自己的AOP工具&#xff0c;但应该对两种主要类型&#xff08;PostSharp和Castle DynamicProxy&#xff09;的AOP工具的运行原理有了基本的理解。PostSharp是一个在编译时编织的后期编译器&#x…

JavaFX官方教程(一)之JavaFX概述

翻译自 JavaFX概述 本章概述了可以使用JavaFX API构建的应用程序类型&#xff0c;下载JavaFX库的位置以及有关正在交付的关键JavaFX功能的高级信息。 JavaFX是一组图形和媒体包&#xff0c;使开发人员能够设计&#xff0c;创建&#xff0c;测试&#xff0c;调试和部署在不同平…

mybatisPlus的分页查询

结论&#xff1a;不是直接limit进行分页的 而是通过rowBounds进行的

详解CockroachDB事务处理系统

本文提到的一些术语&#xff0c;比如Serializability和Linearizability&#xff0c;解释看Linearizability, Serializability and Strict Serializability。 本文中观点大部分都是参考了CockroachDB多篇官方blog,设计文档&#xff0c;代码以及相关资料&#xff0c;相对来说比较…