什么是包装类?
Java设计中一个核心的原则,即万物皆对象,也就是说一切要求用对象的形式描述,但是基本数据类型不是对象,这就很尴尬 矛盾了,为了解决这个尴尬 矛盾,采用 把基本数据类型包装成一个对象,以面向对象的思想去使用这些类型。
包装类作用?
采用基本数据类型包装的形式描述,让功能变得更加健壮,例如: Integer默认不是int的 0 而是 null ,那么比起基本数据类型,包装类对象它就多了一个状态,就像你打王者,除了0代表你没战绩,null 还可以代表你中途跑路了。
还有一个比较直观的,就是包装类给我们提供了很多方法可以使用,例如:数据可以转二进制,查看最大值最小值等等。
除了上面还有一个要点: 集合中不能存放基本数据类型,只能存放对象 所以当使用集合时,我们的就需要使用到包装类对象。
何为装箱拆箱?
装箱:基本数据类型转换成对应的包装类对象。
拆箱:包装类对象转换成对应的基本数据类型。
(装箱拆箱,自动装拆箱操作往下看)
Java提供了8种数据类型,对应8种包装类型
基本数据类型 | 包装类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Byte |
注意点:
是不是有人会疑问呢?怎么没有String呢???
或者压根看到我这段文字的的小伙伴才发现的,是不是平时吹基本数据类型把String也带上了 (→_→)
记住啦 在Java中String 不属于基本类型,String 是一个对象
好了,进入主题
装箱操作
把基本类型转换成对应的包装类对象
第一种装箱方式:直接使用new
int i = 10;
Integer num = new Integer(i);
System.out.print(num);
第二种装箱方式:调用valueOf()的方式
Integer num_2 = Integer.valueOf(20);
System.out.println("调用valueOf()的方式:" + num_2);
细心的小伙伴你会发现,咦,打印对象不应该是地址吗,竟然是数字?
说明了什么?
包装类内部也覆盖了toString
public String toString() {
return toString(value);
}
拆箱操作
与装箱相反,把包装类对象转成对应的基本数据类型
调用intValue方式拆箱,这里其实就是将Integer类型转化为Int类型
Integer num_1 = Integer.valueOf(20);
int num_2 = num_1.intValue();
System.out.println(num_1);
System.out.println(num_2);
运行结果
(很直观的区别在于num_1变量是Integer包装类对象所以可以调用方法,而num_2是基本类型int不能)
自动装箱
基本数据类型直接赋值给包装类对象
Integer num_1 = 66;
System.out.println(num_1);
自动拆箱
包装类对象直接赋值给基本数据类型
Integer num_1 = 66;
int num_2 = num_1;
System.out.println(num_2);
运行结果
很神奇是不是??
不用我们自己亲自去装箱拆箱
信你这颗剽悍的种子!坏得很 (●ˇ∀ˇ●)
那谁帮我们做了?
当然是我们的JVM啦,在我们编译的时候帮我们加上了valueOf,装箱了
想问我怎么知道的?
偷偷告诉你,用反编译工具查看编译后的class文件,有码有真相
编译的时候帮你加上了,没想到吧,哈哈
这种方式有一个术语称为: 语法糖
吃了这颗语法糖,该干的活,帮你干了,果然很甜呀
自动装箱拆箱 本质上是编译的时候帮你加上 valueOf 或 intValue
自动装箱 valueOf
Integer num_1 = Integer.valueOf(66);
自动拆箱 intValue
int num_2 = num_1.intValue();
最后:
如果再深入一些,还可以再剖析一下 valueOf 和 intValue 这两个关键字的一些机制的,但是昨日这篇写了我一天,今早也还在修修补补,时光来去总是匆匆,我想我只能留下次来写了,写博客以来,写的很慢,但也写的很较真,因为 把我会的,认真的分享 ,是我 一颗剽悍的种子 写博客一直不变的信条。如果你能看到这篇,说明咱们还是很有缘的,希望能带给你一些许帮助,创作的不易, 把我文章的知识带走,你的三连留下,点赞,评论,关注,是我最大的动力。