入题

自动封箱与拆箱人人皆可言之道之,但封箱和拆箱却被多数人略之!如此简单的一个机制,却影射着Java的核心理念,不清楚?继续向下看吧~

Java中的数据类别

目前Java中的数据类别分为两种,一种是primitive(原生类型),另一种就是object(对象类型)。

提示:从jdk13开始,会引进第三种类型,名为ValueType,设计理念是结合了primitive和object的优点。

primitive包含8种数据类型,它们分别是:

  • short
  • int
  • long
  • float
  • double
  • char
  • byte
  • boolean

你知道这8种原生的数据类型跟对象在使用上有什么区别吗?为了加深记忆,这里放一张图:

没错!这点你肯定知道的!那就是原生类型在作为参数传递到方法中时使用的是“值传递”的方式,而对象作为参数传递到方法中时使用的是“传引用”的方式。

值传递,意味着传递的是当前值的一个拷贝,而且这个拷贝的生命周期只在当前被传递的方法体内,充其量这个拷贝只是一个临时变量,能让方法体内的其它操作获取到这个值就可以。

至于方法体内对这个值的改变,根本无法反应到方法外的变量中!

而对象传递因为传的是引用,即传的是当前对象的内存地址,所以方法内部对该对象的任何改变都会应用到当前对象所在的内存块中,也就可以实现阶段性的永久改变。

原生类型跟对象类型在传参这块的区别应该是二者在使用上的最大区别!

什么是Java中的包装类?

官方的叫法是Wrapping Class,意思是指原生类型的对象类,这里我简称PWC。那么什么是PWC呢?很简单,JAVA内部对上述的8种原生类型提供了8个对象类,而这8个对象类就是PWC,它们的对应关系如下:

记住这张图就可以了,左边是原生类型primitive,右边是与之对应的对象类型object,如是而已!

为什么要设计出包装类?

其实这个问题是最关键的,只有明白为什么Java要设计出包装类,才能在使用原生类型和对象类型时因地制宜。

理由如下:

第一:如果你想在方法体内更新primitive类型的值,必须要使用primitive对应的object,因为前者使用的值传递,后者使用的是引用传递。

第二:java.util内操作的都是对象,如果没有PWC,会让程序员在使用这些工具类操作primitive类型时编写额外的代码。

第三:Java提供的集合框架中的数据结构,比如ArrayList和Vector,也是只能操作对象,理由跟第二点相似。

第四:多线程中也必须使用对象来完成各种同步操作。

第五:从设计理念上,在Java中,万物皆对象,为primitive类型设计出与之匹配的对象类型,更能让编程体验与设计理念融为一体!

所以,基于上述五点考虑,包装类的存在是有其积极意义的!

包装类的自动化--装箱与拆箱

明白了PWC存在的必要性之后,就需要理解一下JAVA中是如何让primitive和object之间自动转换的。JAVA提供了一种自动化机制,primitive到object叫AutoBoxing(自动装箱),反之叫作Unboxing(拆箱),具体这两种自动化是怎么运作的,先看个例子:

上图中的注释写的很明确了,程序员可以可以使用拆装箱的自动化机制,即primitive和object之间可以混用,java会帮程序员依据方法或类型的实际需要进行内部的拆装箱操作。当然程序员也可以使用手动拆装箱,装箱可以调用object的构造方法或valueOf()方法,拆箱可以调用某个object的xxxValue()方法。

提示:不能因为java提供了自动化的拆装箱机制就不再关心primitive和object之间的区别,关键时刻可能由于参数传递的问题而导致让自己骂自己是小白的bug!

结束语

Wrapping Class的核心作用是让primitive类型跟object类型自动融合按需而用,为了方便编程java提供了拆装箱的自动化机制,普通使用可能感觉不出primitive和object之间的差别,但如果用到了jdk提供的工具类或集合类或是涉及到了多线程编程,拆装箱自动化的价值才会显现出来!因为对高级应用而言,它们只处理对象!

---------关于作者----------

Java开发人员,在今日头条开有视频专栏《Java高级加油站》,头条号名称跟知乎名称相同,想看视频专栏的朋友可以去搜索关关注!

-------------------------------------------------------------------------

java bufferedwriter会自动创建文件吗_Java中为什么会有包装类?自动拆装箱必要吗?关于Wrapping Class这是重点!...相关推荐

  1. java io 创建文件夹_Java中Io流操作-File类的常用操作-创建文件,创建文件夹

    package com.hxzy.IOSer; import java.io.File; import java.io.IOException; public class Demo03 { publi ...

  2. java new file会创建文件吗_Java高级——文件与I/O流

    简介 本文分为四个部分,首先是介绍File类,概括了一下概念.构造方法及常用方法等,其次是描述了面对对象的三大特征,再次是对抽象类进行了简单的概述,最后从特性.使用等等几个方面对接口进行了一定的描述. ...

  3. php 自动创建文件,php:自动创建多级文件夹

    /** * 函数说明 * is_dir:判断给定文件名是否是一个目录,如果是返回ture,如果不是返回false * dirname:返回路径中的目录部分,本函数返回去掉文件名后的目录名.比如$pat ...

  4. File类和各种io类会不会自动创建文件

    File类是不会自动为你生成文件的,它只是为你定位这么一个地方,倘若需要为这个位置上的这个Fiel类所指定的文件名新建一个文件就得用到File类的一个成员方法:public boolean creat ...

  5. 【Unity3D小功能】Unity3D中在创建完项目后自动创建文件夹列表

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦. 一.前言 ...

  6. 如何使用a手动创建文件。 Windows中的(点)前缀?例如,.htaccess

    我想手动创建一个.htaccess文件,并通过Windows UI发现它似乎是不可能的. 我得到一个"你必须输入文件名". 信息. 必须有一种方法来创建文件. 作为Windows中 ...

  7. 成功解决在word文件的表格中当输文字时自动出现加红色和下划线

    成功解决在word文件的表格中当输文字时自动出现加红色和下划线 目录 解决问题 解决思路 解决方法 解决问题 成功解决在word文件的表格中当输文字时自动出现加红色和下划线 解决思路 在输入文字的时候 ...

  8. java路径不存在则创建文件夹_java实现文件夹不存在则创建

    详细内容 判断文件夹是否存在,不存在则创建文件夹. 推荐学习:java视频教程File file =new File("C:\\Users\\QPING\\Desktop\\JavaScri ...

  9. java linux创建文件夹_java web工程在linux下创建文件夹和文件

    具体的创建方法参照下面的实例: public class FileTest { public static void main(String[] args) { // 根据系统的实际情况选择目录分隔符 ...

最新文章

  1. 简单定制自己的Centos系统(第三版)
  2. opencv 调整窗口大小_opencv改变imshow窗口大小,窗口位置的方法
  3. java consumer.poll_kafka消费者API consumer.poll()没有错误,没有异常,只是阻止
  4. vue实现首屏加载等待动画 避免首次加载白屏尴尬
  5. ASP.NET Core+Quartz.Net实现web定时任务
  6. 边缘计算安全技术综述
  7. dj鲜生-24-含资源-模板操作-注册与登陆页的模板继承
  8. WSL2运行 Anbox
  9. JavaScript: The Good Parts 学习随笔(三)
  10. 从防御到应急响应 XDR
  11. mysql-回表查询是什么
  12. 小程序开发之单页面生命周期
  13. 面试经历(某大型机器人少儿编程培训机构)
  14. 苹果App卡审原因猜测分析
  15. upload.js 文件图片上传
  16. Ethercat学习-从站源码移植
  17. ubuntu18.04安装时ACPI error 无法进入系统的问题
  18. ECC/DH 和 ECDH
  19. 机器学习 第三节 第十三课
  20. CureApp高血压治疗App:2021 ESC大会发布在知名心血管期刊《欧洲心脏杂志》上发表的临床试验结果

热门文章

  1. 【Elasticsearch】Elasticsearch中的相似度评分介绍
  2. 【flink】flink Class not resolvable through given classloader ClassNotFoundException: FlinkKafkaConsum
  3. 【MySQL】MySQL 中的 dual表
  4. 【Kafka】nable to write to standard out, closing consumer Console consumer process hangs on SIGINT
  5. JVM :执行jinfo命令报错Can't attach symbolicator to the process
  6. Spring :基于@Transactional注解的声明式事物
  7. SpringBoot : Spring Boot中使用数据缓存 spring-boot-starter-cache
  8. Linux系统中安装软件的三种方法(一)
  9. java8 日期比较_20 个案例教你在 Java 8 中如何处理日期和时间?
  10. BigDecimal你遇见过哪些坑?