01 18Java中级之包装类

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方法比较,否则使用==也可以判断。

发布了77 篇原创文章 · 获赞 11 · 访问量 2658

猜你喜欢

转载自blog.csdn.net/weixin_43762330/article/details/104543597