详解Java自动拆装箱

八种基本类型都有包装类

但数值类型包装类继承自Java.long.Number类,字符和布尔直接继承自Object类

共同的作用是: 让基本类型通过包装类的实例,以对象形式存在

优点: 使基本类型可以直接参与面向对象开发

包装类 类名:Byte Short Integer Long Double Boolean Character

历史版本特点:

JDK1.1版本 之后Number抽象类中byteValue()和shortValue()不再是抽象方法了

JDK1.5版本 后推出自动拆装箱, 属于编译器特性


目录

一、装箱

1. 数字类型装箱

2. 布尔类型装箱

3. 字符类型装箱

二、拆箱

1. 数字包装类拆箱

2. 布尔包装类拆箱

3. 字符包装类拆箱

三、自动拆装箱


一、装箱

1. 数字类型装箱

        继承Java.lang.Number抽象类(Byte Short Integer Long Double)

        每个包装类中 都有 3种 重载的静态方法(没有继承,类中特有的)

               包装类.valueOf(基本类型) 包装类.valueOf(String str) 包装类.valueOf(String str,int index)

        两种使用包装类的方式:

                1.直接new包装类对象(不推荐使用)

、             2.调用valueOf()方法(推荐使用)

         部分包装类型会重用对象,减少对象创建,比如Integer会重 用-128~127之间的整数对象,也有Double.valueOf()编译器会直接new

2. 布尔类型装箱

        布尔型有 2种 重载静态方法:valueOf(boolean)

                                                       valueOf(String)【参数为“true”,返回为true】

3. 字符类型装箱

        字符型有 1种 静态方法:valueOf(char)

int i= 123;
//java推荐我们使用包装类的静态方法valueOf将基本类型转换为包装类,而不是直接new
Integer i1 = Integer.valueOf(i);//Integer会重用-128-127之间的整数对象
Integer i2 = Integer.valueOf(i);
System.out.println(i1==i2);//true
System.out.println(i1.equals(i2));//true

double dou = 123.123;
Double dou1 = Double.valueOf(dou);//Double则是直接new

//包装类转换为基本类型
int in = i1.intValue();//获取包装类对象中表示的基本类型值
double doub = i1.doubleValue();
System.out.println(in);//123
System.out.println(doub);//123.0

in = dou1.intValue();//大类型转小类型可能存在丢精度!
doub = dou1.doubleValue();
System.out.println(in);//123
System.out.println(doub);//123.123

二、拆箱

1. 数字包装类拆箱

        数字类型包装类都继承Java.lang.Number抽象类 后 重写了里面的 6个方法。

        Number抽象类,定义了byteValue() shortValue() intValue() longValue() floatValue() doubleValue() 6个方法

       大类型对象调用 当前对象中 返回小类型的方法 会发生数据 溢出或丢失精度,如Long e >>>byte

//创建 Long 类型对象 l
Long l = Long.valueOf(1);
//Long类型对象 l 调用byteValue() 转换为byte型
byte b = l.byteValue();

        基本类型作为参数时,当 实际参数类型 范围大于 形式参数类型范围时 参数传递需要用强转,注意的是作为局部变量时不用强转,因为byte类型short类型 底层封装的是int型数据,字面量又默认是int型,所以可以直接赋值。

Long l =Long.valueOf(1);//参数为long型 传int型不会报错 小类型转大类型 自动类型转换
Byte b = Byte.valueOf(1);//参数为byte型 传int型会报错  大类型转小类型 需要强转

        JDK1.0 之前,Number中,6个 拆箱方法都是抽象方法

        JDK1.1之后,Number中,byteValue()和shortValue()不是抽象方法,其他是抽象方法

2. 布尔包装类拆箱

        布尔包装类 有1种 拆箱方法:booleanValue()

//装箱
Boolean b1 =Boolean.valueOf(true);
//拆箱
boolean b2 = b1.booleanValue();

3. 字符包装类拆箱

        字符包装类 有 1种拆箱方法:charVaule()

//装箱
Character c1 = Character.valueOf('c');
//拆箱
char c2 = c1.charValue();

三、自动拆装箱

        编译器特性,当基本类型引用类型 相互赋值时,会自动调用装箱或拆箱方法,自动补全代码,是 JDK1.5 之后出现的新特性

        优点:自动补全代码,节省代码量

public static void main(String[] args) {
/*
  定义:该特性是编译器认可的.当编译器编译源代码时发现有基本类型和引用类型相互赋值使用时会自动补充代码来完成他们的转换工作,这个过程称为自动拆装箱.
  触发自动拆箱特性,编译器会补充代码将包装类转换为基本类型,下面的代码会变为:
  int i = new Integer(123).intValue();
*/

  int i = new Integer(123);

/*
  触发编译器自动装箱特性,代码会被编译器改为:
  Integer in = Integer.valueOf(123);
*/

  Integer in = 123;
}

完......

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值