目录
- 1 为什么提供包装类?
- 2 装箱和拆箱
- 3 包装类的4个特点
- 4 包装类类型
正文
1 为什么提供包装类?
1) 由于Java的基本数据类型功能简单,不具备面向对象的特性,实际使用时存在很多的不便,所以为所有的基本类型都提供了对应的包装类。
2) 包装类为基本数据类型提供一些操作方法和属性(最大值、最小值等),比如包装类提供了将字符串转为基本类型的静态方法以及最小值属性。
Float f1 = Float.valueOf("1.01");
Float f2 = Float.MIN_VALUE;
3) 在涉及对象的操作时,可以使用包装类对象替换基本数据类型,比如HashMap只能储存Object对象的引用,不能存储基本类型。
Map map = new HashMap();
map.put("key1",new Integer(100));
map.put("key2",100);//由于Java5.0以上支持自动装箱拆箱,所以此行代码编译也能通过,编译器默认将100转为了它的包装类。
2 装箱和拆箱:
1) 装箱:把基本数据类型转为包装类。
2) 拆箱:把包装类转为基本数据类型。
3) Java5.0以上支持自动装箱拆箱。
Integer i1= 100;// 自动装箱,编译器自动调用Integer.valueOf(100);
int i2 = i1;// 自动拆箱,编译器自动调用i1.intValue(100);
int i3 = new Integer(100);// 自动拆箱
3 包装类的4个特点:
1) 包装类都是final类,不能被继承。
2) 值不变:包装类第一次创建后,它表示的值就不会再改变,也没有提供任何方法改变它。
3) 提供两种构造函数:
① 第一种构造函数:以基本类型值作为参数。
② 第二种构造函数:以String作为参数,且String表示的值是十进制的。
//第一种构造函数
Integer i1 = new Integer(010); //表示八进制,值为8
//第二种构造函数
Integer i2 = new Integer("010"); // 表示十进制的10
4) 都有静态域TYPE,表示Class对象。Integer.TYPE和int.class等价。
4 包装类类型:
1) Void(比较特殊,和一般包装类不一样,可忽略):
① 没有要包装的值,不提供方法,不能被实例化。
② Void只有一个静态TYPE域,等价于void.class。
2) Boolean
3) Character
4) Number:Number是一个抽象类,所有基本数值类型的包装类都继承该类,且都要覆盖Number的以下方法,以便数值之间进行转换。基本数字类型包装类(Byte、Short、Integer、Long、Float、Double)
byteValue(); | shortValue(); | intValue(); | longValue(); | floatValue(); | doubleValue(); |
5) 整数包装类:Byte、Short、Integer、Long,针对-128到127之间的数据,做了一个数据 缓冲池,所以在进行==比较时,要特别注意。如果直接用基本类型和包装类型比较,则包装类型会退化为基本类型。
Integer i1 = 127; // 自动装箱,使用Integer.valueOf(127),取的缓冲区中的对象。
Integer i2 = 127;
System.out.println(i1 == i2);// true
Integer i3 = new Integer(127); // 不去取缓冲区的对象,所以不相等
Integer i4 = new Integer(127);
System.out.println(i3 == i4);// false Integer i5 = 128;// 自动装箱,使用Integer.valueOf(128),但超过了127,所以也不会取缓冲区中的对象。
Integer i6 = 128;
System.out.println(i5 == i6);// false int i7 = 128;
System.out.println(i6 == i7);// true 和基本类型比较时,包装类型会自动转为基础类型,所以相等
6) 浮点数包装类:Float、Double