「JAVA」Java面向对象之包装类,拆箱、装箱

包装类,拆箱、装箱——一切皆对象


为何要包装类

    1. 在面向对象中,”一切皆对象”,但基本数据类型的特殊存在不太符合这一理念,面向对象面向得并不纯粹,因为基本类型变量并不是对象;

    2. 涉及进制间的转换的算法,数据类型间的基本操作;如果都要我们来实现,那工作量就太大了;

    3. Java的集合框架并不支持基本数据类型的存储,只支持对象类型的存储,支持基本类型存储的就只有数组了;

故此,针对Java基本数据类型封装了包装类,每一个基本类型都有一个对应的包装类,以下是详情:

基本数据类型的包装类

八大基本数据类型的包装类都使用final修饰,都是最终类,都不能被继承。

八大基本数据类型的包装类  

拆箱和装箱

装箱:把基本类型数据转成对应的包装类对象。

方式一:Integer i = Integer.value(13);

方式二:Integer i = new Integer(13);


拆箱:把包装类对象转成对应的基本数据类型数据。

int value = i.intValue();


自动装箱(Autoboxing)和自动拆箱(AutoUnboxing)

在Java 5之前的版本中,基本数据类型和包装类之间的转换是需要手动进行的,但Sun公司从Java5开始提供了的自动装箱(Autoboxing)和自动拆箱(AutoUnboxing)操作 ;

自动装箱:可以把一个基本类型变量直接赋给对应的包装类型变量。比如:Integer i = 13;

自动拆箱:允许把包装类对象直接赋给对应的基本数据类型变量。

比如:Integer i = new Integer(13);

           Int j = i;

自动装箱和自动拆箱,也是一个语法糖/编译器级别新特性,在底层依然是手动装箱、拆箱操作;但是在装箱操作中使用的是Integer.valueOf()方法,而不是直接new Integer();其他的几个包装类也是如此,装箱操作中使用的是各自的valueOf()方法。

自动装箱和自动拆箱的反编译效果


switch 对包装类的支持

switch支持的基本数据类型:byte,short,char,int;也支持对应的包装类。因为在底层,switch中会对包装类做手动拆箱操作。

switch 中包装类的支持


考虑后面这样一句代码:Object obj = 17;

在上述代码语句中有如下的操作:

1. 自动装箱,把17自动装箱为Integer类型: Integer i = 17;

2. 引用的自动类型转换,把子类对象赋给父类变量: Object obj = i; 因为Object类是所有Java类的父类;因此,Object类型可以接受一切数据类型的值;Object数组:Object[],该数组可以保存一切数据类型。所以:Object[] arr = {“A”,12,3.14,true}; // 这是完全可行的


包装类的常用操作方法(以Integer为例)

1. 包装类中的常量:

     MAX_VALUE :最大值

     MIN_VALUE :最小值

     SIZE :变量在内存中存储数据占多少位

     TYPE :对应的基本类型

2. 包装类的构造器:创建包装类对象

案例代码如下所示:

创建包装类对象案例

其他的几个包装类型也是这样的规律,具体实现查看源码即可。


3. 基本类型和包装类型的转换(装箱和拆箱)

装箱:

装箱

拆箱:

拆箱


4. String和基本类型/包装类型之间的转换操作

把String转换为包装类类型

把String转换为包装类类型


把包装类对象转换为String

把包装类对象转换为String


把基本数据类型转换为String

把基本数据类型转换为String


把String转换为基本数据类型

parseXxx(String s) : xxx表示8大基本数据类型,如:

把String转换为基本数据类型


5. 对于Boolean来说

无论是使用new Boolean(“”); 还是Boolean.valueOf(“”), 只有使用true/TRUE会被认为是true,其他都是false。

boolean 包装类的字符串构造器

包装类中的缓存设计

在包装类中提供了缓存设计,会对一定范围内的数据作缓存,如果数据在范围内,会优先从缓存中取数据,超出范围才会创建新对象;Byte、Short、Integer、Long:缓存[-128,127]区间的数据;Character:缓存[0,127]区间的数据;包装类中的缓存设计,也称为享元模式

缓存设计会在包装类中的valueOf()方法中实现,所以才会推荐使用valueOf()方法来实现拆箱操作,如下是Integer类的valueOf()源码:

valueOf() 方法源码


再查看缓存实现细节:

IntegerCache 源码


通过查看源码可知,JVM会对-128 到 127之间的做缓存,如果你的变量值在这个范围内,就会优先从缓存中取数据,否则就会创建新对象。当然这个缓存区间也是可是设置的。

那么以下这个例子就可以解释了:

享元模式 代码案例

我们再来看Integer的equals方法的实现源码:

Integer的equals方法


可以发现,包装类在比较时会将包装类型拆箱为基本数据类型,并使用==做比较


包装类型和基本数据类型的区别

包装类型和基本数据类型的区别(以Integer与int的区别为例):

1.默认值:

        int(基本数据类型呢)的默认值是0。

        Integer(包装类型)的默认值为null。Integer既可以表示null,又可以表示0。

2.包装类中提供了该类型相关的很多算法操作方法:

包装类中的算法操作

3.在集合框架中,只能存储对象类型,不能存储基本数据类型值。

4.Integer和int并不是相同的数据类型,尽管值是相同的。Integer是一个类,可以实例化为对象,但int只是一个基本数据类型。

5.在JVM中,基本类型变量存储在栈中的,而包装类型对象存放于堆中。

其实,包装类就是把基本数据类对象化,包装类是基本数据类型的超集;在开发中,建议成员变量优先使用包装类型,局部变量优先考虑基本数据类型。

完结。老夫虽不正经,但老夫一身的才华

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容