包装类
java是一种面向对象的编程语言,说起包装类,这个名词的定义让人很头痛。但是如果我们尝试这样去理解...
我们把java的类看成一个宇宙的大家族,就像复联中的影响一样,不同英雄不同能力,就是不同的类。但是他们的基本属性都是人发展而来的。
然后儿,在复联的后期,很多不中种族的战士都加入了进来,但是呢,在整个语言家族中却存在一些异类,他们不能像对象一样进行属性和方法的调用以及进行相互之间的对象化处理。
所以包装类的存在就是为了解决他们所产生的问题,让他们可以像对象一样进行交互。
回忆
首先让我们回忆一下java中的数据类型:
其中基本数据类型是不具有对象特征的:不可以像对象有属性和方法,以及对象化的交互。通过包装类,可以让这些基本数据类型形获取对象特征,行使对象的权利。
下面的表是这些基本数据类型和包装类的对应关系:
基本类型 | 对应的包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Flot |
double | Double |
char | Character |
boolean | Boolean |
额外注意int,char的包装类的变化。
怎么使用?
首先类似让我们去Java API看看java API,在API中的lang包下找到Integer类
这是关于方法的介绍信息,可以看到方法的转换是有规律的。
可以发现,Integer是在finally关键字修饰,说明它不可以被继承,没有子类。
此外,可以看到,Integer继承自Number类,说明在数值型包括(byte,short,long...)等等全部数值型的类都是继承自Number的
装箱和拆箱
- 装箱:就是将基本数据类型转换为包装类
- 拆箱:就是将包装类转换为基本数据类型
此外,这两种都有手动和自动转换的方式,让我们看看怎么去转换他们。
让我们在eclipse中创建一个WrapperProj的包装类工程,然后新建一个com.kilig.wrapper包,然后新建一个测试类WrapperTestOne
装箱操作
- 自动装箱就是 直接定义包装类后,直接将a1的值赋值给a2;
- 而手动装箱则是 通过new 关键字,构造函数,将a1的值构造给a3;
拆箱
手动拆箱调用的是类中的intValue的方法,就是上面我们在JavaAPI中看到的,通过该方法将对象中数据取出,赋值到整型变量中。
补充一下:
之前我们在Java API中看到的实例方法中,可以看到这些是数值转换的方法,说明我们同时也可以把int类型的书转换为其他类型的数值类型,让我来试一试:
可以看到,我们的int 类型的a2,已经被转换为double类型的c1了✌️。
基本数据类型&字符串
这里我们,我们新建一个测试类包用来转换基本数据类型和字符串。
基本类型---->字符串
我们通过调用Integer在这个包类的toString的方法
字符串---->基本类型
调用包装类中的parse方法来进行转换
我们知道,在进行基本数据类型时都是有初始值都有默认值的设置的
下面这个表事就是默认设置的信息:
基本类型 | 默认值 |
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0f |
double | 0.0d |
char | '\u0000' |
boolean | false |
那么当包装类的对象初始值是多少呢?
在eclipse中,我们做了一个小的程序去直观的看初始值:
在测试代码中:
以上是正常的数值的对应默认初始值,那么如果我们换成包装类会出现什么呢?
可以看到,我们的包装类Integer变成了null,因为Integer是一个类,所以系统默认的初始值就是null。同样其他的包装类也是这样的。
【补充一点】
大家猜一猜结果是什么?
💁🏼💁答案:==点击查看答案==
你猜对了么?那么为什么呢?
因为,one,two在这儿是对象,java中“==”,比的是对象在内存中的引用,而不是一个单纯的值,new Integer() 是在内存中开辟一个新空间。one,two都是使用new关键字,在内存空间中分别指向的是不同的空间,所以肯定是不相等的。
那么,这个呢?
💁💁🏼答案:==点击查看答案==
你答对了么?
这是为什么呢?因为,Integer three =100; 是和 integer three =Integer.valueOf(100); 是一样的。都是是一个自动装箱操作。而three==100,则是一个数值的对比。所以答案就是
那么又有一个额问题了!
💁🏼💁答案是:点击查看答案
你答对了么?
这是因为,我们上面也提到了,装箱操作相当于是integer three =Integer.valueOf(100);也就是说,当创建新的four时,程序系统会默认在内存中找是否有这样的值供他使用,
- 而且需要的参数设置是在 -128<参数<127
- 如果参数在该范围内,那么直接在缓存区产生数值,如果不在这个范围内,则需要实例化Integer一个新的区域去存放
所以在==两遍对比的对象时指向同一个寄存空间的,所以答案是:
总结
我们可以通过API的学习,知道了java中的所有包装类都在java.lang包中,通过拆箱,装箱,完成对基本数据类型和包装类的转换。也可以借助包装类完成基本数据类型和字符串之间的转换。