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公司已经为我们写好了,我们直接使用即可。
基本数据类型 | 包装类型 |
---|---|
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) |
装箱其实在上面的例题中演示过了,就是将基本数据类型包装成引用数据类型
//基本数据类型10经过构造方法的包装,实现了从基本数据类型向引用数据类型的转换 //基本数据类型 --> 引用数据类型(装箱) Integer integer = new Integer(10);
既然装箱是将基本数据类型转换成引用数据类型,那么拆箱可想而知就是将引用数据类型转换成基本数据类型。
那么,如何来实现呢?
查看包装类底层代码可知,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
JDK1.5之后,支持自动装箱和自动拆箱了
//自动装箱 //int基本数据类型-->自动转换-->Integer类型 Integer a = 100; //自动拆箱 //Integer类型-->自动转换-->int基本数据类型 int b = a;