【java-语法】包装类

本文介绍了Java中的类、包装类的概念,包括基本数据类型与引用数据类型的区别,以及装箱(将基本类型转为包装类)和拆箱(从包装类转回基本类型)的过程。通过实例解释了装箱和拆箱在实际编程中的应用,并解答了一道关于包装类在面试中的问题。
摘要由CSDN通过智能技术生成

📢编程环境:idea

先回忆一下Java中的类是啥?

Java中的数据类型分为八大基本数据类型和一些引用数据类型。在Java中,当计算机一次要保存一个数据时,要用基本数据类型向内存申请空间。这一个数据可以是整型(例如10,100,5000等单个整数),浮点型(例如20.5,500.6等单个小数),字符(例如‘d’,‘O’,‘20’等单个字符),真值(true或false),对应的基本数据类型为整型(根据申请的空间从大到小依次有long,int,short,byte),浮点型(float和double),字符型(char),布尔型(boolean)。当计算机一次要保存一组数据时,要用引用数据类型向内存申请空间。这一组数据可以是n个数字(例如1,2,3,4,5),一个字符串(例如“1234bjhkK”),一个对象(例如一个人的姓名,年龄,星座,出生日期,职业)等,对应的引用数据类型为数组array,字符串String,类class等。

每个基本数据类型的变量空间里存的就是对应的每个数据,引用数据类型的变量空间里存的是对应那组数据的地址

java是一门面向对象的编程语言。对象就是现实中的实体,面向对象就是依靠对象之间的交互解决问题。在Java语言中,一般通过创建一个类来描述现实中的一个对象,对象的产生依赖于类

Object类是Java中所有类的父类。包装类是Object类的子类。

包装类是啥?

每个基本类型都有一个对应的包装类。

基本数据类型变量向内存申请一个空间,这个空间中就放着这个数据本身。而包装类是引用数据类型,引用类型变量向内存申请空间后,这个空间中放的是数据真正所在空间的地址。也就是:基本数据类型变量存数据,而包装类变量存数据地址,指向数据
有时,需要把基本数据类型变量转换成引用数据类型变量,例如在有关泛型的代码中,只支持继承了Object类的引用数据类型,所以为了在泛型代码中可以支持基本数据类型,Java给每个基本数据类型都对应了一个包装类型。

要注意的是:包装类默认被final修饰,不能有子类。一旦把基本数据类型转换为包装类,就不能更改数据的值了!

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

除了 Integer 和 Character, 其余基本类型的包装类都是首字母大写。

装箱和拆箱

装箱就是把基本数据类型变量转化为包装类变量的过程,拆箱是把包装类变量转化为基本数据类型变量的过程。java中,装箱和拆箱的底层实现源码根据基本数据类型不同都会有所差异,这是由于每个基本数据类型所存数据的范围不同导致的。但是在开发使用层次上,把数据进行装箱和拆箱的指令都是统一的。接下来我们就来看看怎么把数据进行装箱和拆箱。

怎么装箱

装箱就是通过调用包装类的valueOf()方法,例如Integer.valueOf(),Double.valueOf()等,把基本数据类型的数据转化为包装类的过程。

装箱是编译器认可的。编译器在生成类的字节码文件时,调用包装类.valueOf()等方法完成装箱。java虚拟机只是执行这些字节码。

装箱有自动装箱和显示装箱两种。

  • 自动装箱是编译器默认调用数据的基本数据类型对应的包装类的valueOf()方法。自动装箱只能把数据默认装箱为基本数据类型对应的包装类。例如把int类型的数据a自动装箱为包装类a,编译器默认调用Integer.valueOf()方法
    在这里插入图片描述
    在这里插入图片描述
  • 显示装箱是程序员在写装箱语句时,根据需求调用需要的包装类的valueOf()方法,把一个基本数据类型的数据装箱为需要的包装类。例如把整型a依次装箱为Integer类的a和Double类的a,编译器根据指令依次调用Integer.valueOf()方法和Double.valueOf()方法
    在这里插入图片描述在这里插入图片描述

怎么拆箱

Integer a = new Integer(10)为例,其他包装类同理:

拆箱就是通过调用基本数据类型的Value()方法,例如Integer类的a拆箱为int类型,要调用a.intValue()方法。把包装类的数据变成基本数据类型的过程。

拆箱和装箱一样,都是编译器认可的。编译器在生成类的字节码文件时,调用基本数据类型的Value()方法完成拆箱,java虚拟机只是执行这些字节码。

拆箱有自动拆箱和显示拆箱两种。

  • 例如把Integer类的a依次自动拆箱为整型数据a和浮点型数据a。此时编译器都是默认调用a.intValue()方法

    • 但把对象a自动拆箱为float类型的数据时,编译器先调用a.intValue()方法把对象a拆箱为int类型的数据后,会再把int类型的a(自动)强制类型转换为float类型的数据a。
      在这里插入图片描述在这里插入图片描述
  • 显示拆箱是写拆箱语句的时后,根据需求调用需要的基本数据类型的Value()方法,把包装类对象拆箱为所需要的基本数据类型的数据。例如把对象a依次显示拆箱为整型数据a和浮点型数据a,编译器根据指令依次调用a.intValue()方法和a.doubleValue()方法
    在这里插入图片描述
    在这里插入图片描述


一道来自阿里的面试题

问:把a,b自动装箱,然后比较a,b两个对象,输出结果。把a1,b1自动装箱,比较a1,b1两个对象,输出结果。分析为什么a==b的结果为true?为什么a1==b1的结果为false?

在这里插入图片描述

解:
我们知道:基本数据类型的变量空间里存的是数据的值,引用数据类型的变量空间里存的是数据的地址,包装类是引用数据类型。

在题目中,a,b,a1和b1都是四个Integer包装类,在java中,int类型的a,b,a1和b1和Integer类型的a,b,a1和b1是不同的。int类型的四个变量a,b,a1和b1,内存空间里分别存的就是a值,b值,a1值和b1值。而他们装箱后,Integer类型的四个变量a,b,a1和b1,内存空间里存的分别是a值的地址,b值的地址,a1值的地址和b1值的地址。

所以为什么a ==b的结果为true? 为什么a1 ==b1的结果为false?因为变量a和变量装箱后指向同一个空间,存了相同的地址,而变量a1和变量b1装箱后指向不同的空间,存的是不同的地址。
答案更多详情见文章:【java-读装箱源码,解阿里面试题】包装类

  • 30
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: double类是Java中的一个包装类,用于封装基本数据类型double。它提供了一些方法,可以对double类型的数据进行操作和转换。例如,可以使用double类的parseDouble方法将字符串转换为double类型的数据,也可以使用doubleValue方法将Double对象转换为double类型的数据。此外,double类还提供了一些常量,如MAX_VALUE和MIN_VALUE,分别表示double类型的最大值和最小值。在Java中,double类型的数据通常用于表示浮点数,如小数或科学计数法表示的数值。 ### 回答2: Java的double类是基本数据类型中的一种,它是一个浮点数类型,可以用来表示小数或者整数。在Java中,如果需要使用双精度浮点数,我们可以直接使用double类型,而不需要使用其它类库或者自定义数据类型。 Java的double类提供了很多方法来处理双精度浮点数。比如,我们可以使用doubleValue()方法将一个Double对象转换成double类型的值;使用compareTo()方法比较两个double类型的值的大小;使用isNaN()方法判断一个double类型的值是否为非数值。 同时,Java的double类还提供了一些常量,如MAX_VALUE、MIN_VALUE、POSITIVE_INFINITY、NEGATIVE_INFINITY和NaN。其中,MAX_VALUE表示double类型的最大值,MIN_VALUE表示double类型的最小值,POSITIVE_INFINITY表示正无穷大,NEGATIVE_INFINITY表示负无穷大,NaN表示非数值。 除了基本的方法和常量,Java的double类还可以拆箱和装箱。拆箱指将Double类型的值转换成double类型的值,而装箱则是将double类型的值封装成一个Double对象。 在实际开发中,我们常常使用double类型来表示货币、收入、体重、距离等数值。使用double类型可以方便地进行数值计算,并且Java的标准库中提供了许多API来对double类型的值进行操作和处理,这大大提高了开发效率。使用double类型时需要注意其精度问题,因为在进行除法等计算时,可能会出现精度丢失的情况。此时,我们可以使用BigDecimal类来解决这个问题。 综上所述,Java的double类是一个非常重要的基本数据类型,我们在日常开发中经常使用,需要熟练掌握其使用方法和注意事项。 ### 回答3: 练习Java包装类之Double类是学习Java语言基础的必备内容,Double类是Java中常用的包装类之一,它用于将基本数据类型double封装成一个对象。Double类提供了很多有用的方法,能够方便地进行数字转换、计算和比较等操作。 Double类中最常用的方法是parseDouble(),它可以将一个字符串转换为double类型的数据。例如,可以使用Double.parseDouble("3.14")来获得一个double类型的值3.14。同时,Double还提供了很多其他的方法,如doubleValue()方法用于将Double对象转换为double类型,intValue()方法用于将Double对象转换为int类型,toString()方法用于将Double对象转换为字符串类型等。 此外,在使用Double类时还需要注意几个重要的特性。一是Double类是不可变的,即一旦创建了一个Double对象,它的值就不能再改变了。这意味着如果需要在程序中对double类型的数据进行频繁的修改,就应该使用基本数据类型double,而不是Double对象。 二是由于Double类是对象,所以在比较两个Double对象时,应该使用equals()方法而不是==操作符。因为==操作符只比较两个对象的内存地址,而不是它们的值,而equals()方法则比较两个对象的值是否相等。 最后,需要了解的是Double类中一些重要的常量。例如,Double.MAX_VALUE表示可表示的最大双精度浮点数,Double.MIN_VALUE表示可表示的最小双精度浮点数,NaN表示非数字(Not a Number),Infinity表示正无穷或负无穷。 练习Java包装类之Double类能够帮助我们更好地理解Java语言的基础知识和语法规则,同时提高我们对数字的处理能力和代码编写的效率。建议在学习Java语言时,重点掌握和实践常用的包装类,以更好地应用Java语言进行开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值