Javase学习15-自动装箱与自动拆箱

Posted TSCCG

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javase学习15-自动装箱与自动拆箱相关的知识,希望对你有一定的参考价值。

Javase学习15-自动装箱与自动拆箱

1. 问题引入

java中8种基本数据类型又对应了8种包装类,8种包装类属于引用数据类型,父类是Object。

那么问题来了,SUN公司为什么要再提供8种包装类呢?

我们试想这样一种情况,一个方法需要传入一个数字,但是参数类型是Object类型的,而数字属于基本数据类型,显然该方法无法接收基本数据类型的数字。这说明8种基本数据类型不够用。

那么这时该如何处理?

public class IntegerDemo01 {
     //程序入口
    public static void main(String[] args) {

    }
    //需要传入数字的方法
    public static void getNum(Object obj) {
        System.out.println(obj);
    }
}

我们可以传入一个数字对应的包装类进去:

/**
 * @Author TSCCG
 * @Date 2021/6/2 18:16
 */

public class IntegerDemo01 {
    public static void main(String[] args) {
        //将100这个数字通过构造方法包装成一个对象
        YourInt yourInt = new YourInt(100);
        //getNum()方法虽然不能直接传入100,但是可以传入100对应的包装类型
        getNum(yourInt);

    }
    public static void getNum(Object obj) {
        System.out.println(obj);
    }
}
//int类型的包装类,继承Object
class YourInt {
    int value;
    //new对象的时候通过构造方法将数字传入对象
    public YourInt(int value) {
        this.value = value;
    }
    //重写toString,使其输出的是数字
    @Override
    public String toString() {
        return String.valueOf(value);
    }
}

输出结果:

100

如此便解决了这种问题。

在实际开发中,我们不需要自己写包装类,8种基本数据类型对应的8种包装类,SUN公司已经为我们写好了,我们直接使用即可。

2. 八种基本数据类型对应包装类

基本数据类型 包装类型
byte java.lang.Byte(父类Number)
short java.lang.Short(父类Number)
int java.lang.Integer(父类Number)
long java.lang.Long(父类Number)
float java.lang.Float(父类Number)
double java.lang.Double(父类Number)
boolean java.lang.Boolean(父类Object)
char java.lang.Character(父类Object)

3. 装箱与拆箱

3.1 装箱

装箱其实在上面的例题中演示过了,就是将基本数据类型包装成引用数据类型

//基本数据类型10经过构造方法的包装,实现了从基本数据类型向引用数据类型的转换
//基本数据类型 --> 引用数据类型(装箱)
Integer integer = new Integer(10);

3.2 拆箱

既然装箱是将基本数据类型转换成引用数据类型,那么拆箱可想而知就是将引用数据类型转换成基本数据类型。

那么,如何来实现呢?

查看包装类底层代码可知,8种包装类中有6个的父类都是Number,故可以先研究一下Number类。

Number类是一个抽象类,有如下方法:

修饰语和类型 方法 描述
byte byteValue() 返回指定号码作为值 byte ,这可能涉及舍入或截断。
abstract double doubleValue() 返回指定数字的值为 double ,可能涉及四舍五入。
abstract float floatValue() 返回指定数字的值为 float ,可能涉及四舍五入。
abstract int intValue() 返回指定号码作为值 int ,这可能涉及舍入或截断。
abstract long longValue() 返回指定数字的值为 long ,可能涉及四舍五入或截断。
short shortValue() 返回指定号码作为值 short ,这可能涉及舍入或截断。

以上方法在所有数字包装类子类中都有,是专门负责拆箱的,我们可以用引用数据类型调用上面的方法拆箱成各种基本数据类型

//基本数据类型10经过构造方法的包装,实现了从基本数据类型向引用数据类型的转换
//基本数据类型 --> 引用数据类型(装箱)
Integer integer = new Integer(10);
//引用数据类型 --> 基本数据类型(拆箱)
int i = integer.intValue();
System.out.println(i);//10

//引用数据类型通过调用自身的floatValue返回一个float类型的数字
float f = integer.floatValue();
System.out.println(f);//10.0

4. 自动装箱与自动拆箱

JDK1.5之后,支持自动装箱和自动拆箱了

//自动装箱
//int基本数据类型-->自动转换-->Integer类型
Integer a = 100;
//自动拆箱
//Integer类型-->自动转换-->int基本数据类型
int b = a;

以上是关于Javase学习15-自动装箱与自动拆箱的主要内容,如果未能解决你的问题,请参考以下文章

JavaSE8基础 Integer与int自动转换 自动装箱与拆箱

自动装箱与拆箱

自动装箱拆箱(Autoboxing,Unboxing)

Java自动装箱与拆箱

了解Java的自动装箱与拆箱

装箱与拆箱