文章目录
1 包装类实现原理分析
包装类的主要功能是针对于基本数据类型的对象转换而实现的,并且随着JDK版本的更新包装类的功能也在发生着改变,有着更多的支持。
Object类最大的特点是所有类的父类,可以接收所有的数据类型,但在这个过程之中存在有一个问题:基本数据类型并不是一个类,所以如果要想将基本数据类型以类的形式进行处理,那么就需要对其进行包装。
基本数据类型进行包装处理后可以像对象一样进行引用传递,同时也可以使用Object类来进行接收。
可以发现在Java中包装类一共提供有两种类型:
(1)对象型包装类(Object直接子类):Boolean、Character。
(2)数值型包装类(Number直接子类):Byte、Integer、Long、Short、Float、Double。
Number是一个抽象类,以后只要是看见了Number都应该明确的表示它是一个数字的概念,这个类定义有如下方法:
序号 | 方法 | 类型 | 作用 |
---|---|---|---|
1 | public byte byteValue() | 普通 | 返回byte数据类型的值 |
2 | public short shortValue() | 普通 | 返回short数据类型的值 |
3 | public abstract int intValue() | 抽象 | 返回int数据类型的值 |
4 | public abstract double doubleValue() | 抽象 | 返回double数据类型的值 |
5 | public abstract float floatValue() | 抽象 | 返回float数据类型的值 |
6 | public abstract long longValue() | 抽象 | 返回long数据类型的值 |
Number类中的方法就是直接提供有获取包装类中基本数据类型的功能,一共只定义了六个方法。
2 装箱与拆箱
基本数据类型的包装类都是为了基本数据类型转为对象提供的,这样对于基本类型与包装类之间就有了如下操作关系:
(1)数据装箱:将基本数据类型保存到包装类之中,一般可以利用构造方法完成。
(2)数据拆箱:从包装类中获取基本数据类型,
public class JavaDemo{
public static void main(String[] args){
Integer n = new Integer(10); //手动装箱
int sum = n.intValue(); //手动拆箱
Integer nA = 100; //自动装箱
int sumA = nA; //自动拆箱
}
}
可以发现从JDK 1.9之后,对于所有包装类之中提供的构造方法就变为了过期处理,不建议用户再继续使用了,这是因为从JDK 1.5之后为了方便处理提供了自动的装箱与拆箱操作,所以这种手工的模式基本上没人用了。
public class JavaDemo{
public static void main(String[] args){
Integer n = new Integer(10); //手动装箱
n++;
int sum = n.intValue(); //手动拆箱
Integer nA = 100; //自动装箱
nA++;
int sumA = nA; //自动拆箱
}
}
除了提供有这种自动的数学运算支持之外,使用自动装箱最大的好处是可以实现Object接收基本数据类型的操作。
范例:Object接收int。
public class JavaDemo{
public static void main(String[] args){
Object obj = 100; //自动装箱,向上转型
obj++; //此时不可,会出错。
int n = (Integer)obj; //强制向下转型,自动拆箱
}
}
JDK 1.5之后提供的自动支持功能,到了JDK 1.9之后为了巩固此概念,所以将包装类的构造方法都设置为过期定义了。
但是对于包装类需要注意一些问题了,关于相等判断上。
范例:观察相等判断
public class JavaDemo{
public static void main(String[] args){
Integer n1 = 127;
Integer n2 = 127;
System.out.println(n1 == n2);
Integer n3 = 128;
Integer n4 = 128;
System.out.println(n3 == n4);
Integer n5 = -129;
Integer n6 = -129;
System.out.println(n5 == n6);
}
}
/*
true
false
false
*/
以后进行包装类相等判断的时候一定要使用equals方法完成,而包装类本身也需要考虑占位的长度,如果超过了一位的内容,就需要使用equals方法比较,否则使用==也可以判断。