【第十九章】包装类
包装类的主要功能是针对于基本数据类型的对象转换而实现的,并且随着JDK版本的更新,包装类的功能也在发生改变,有着更多的支持。
一.包装类实现原理分析:
1.认识包装类:
Object类最大的特点是所有类的弗雷,并且可以接受所有数据类型,但是在这个过程中存在一个问题:基本数据类型并不是一个类
所以现在如果要想将基本数据类型以类的形式进行处理,我们就要对其进行包装
范例:以int数据类型为例实现包装处理
class Int{ private int date; //包装一个基本数据类型 public Int(int date){ this.date = date; } public int Intvalue(){ return this.date; } } public class SSS { public static void main(String [] args){ Int temp = new Int(10); //装箱:将基本数据类型保存在包装类中 int x = temp.Intvalue(); //拆箱:从包装类中获取基本的数据类型 System.out.println(x * 2); } }
基本数据类型进行包装处理后可以像对象一样进行引用传递,同时也可以用Object类进行接收,但是如果都已经可以发现基本数据类型与Object类之间的缺陷,那么JDK也早就发现了同样的问题,所以在JDK1.0的时候就提供了包装类的一个概念。
基本数据类型一共有八种,所以提供有八种包装类,那么这八种包装类的定如下:
所以现在可以发现,在JAVA中包装类一共提供有俩中类型:
(1)对象型包装类(Object的直接子类):Boolean、Character;
(2)数值型的包装类(Number直接子类):Byte、Short、Integer、Long、Float、Double;
Number是一个抽象类,以后只要是看见了Number都应该明确的表示他是一个数字的概念,这个类定义有如下的方法:
No. |
方法名称 | 类型 | 应用 |
1 |
public byte byteValue() | 普通 | 从包装类中获取byte数据 |
2 |
public short shortValue() | 普通 | 从包装类中获取short数据 |
3 |
public abstract int intValue() | 普通 | 从包装类中获取int数据 |
4 |
public abstract long longValue() | 普通 | 从包装类中获取long数据 |
5 |
public abstract float floatValue() | 普通 | 从包装类中获取float数据 |
6 |
public abstract double doubleValue() | 普通 | 从包装类中获取double数据 |
Number类中的方法就是直接提供有获取包装类中基本数据类型的方法,一共定义有6个方法(很重要)
二.装箱与拆箱:
基础数据类型的包装类都是为了基本数据类型转为对象提供的,这样对于基本类型与包装之间就有了如下的操作关系:
1.数据装箱:将基本数据类型保存到包装类之中,一般通过构造方法完成:
2.数据拆箱:从包装类中获取基本数据类型:
|- 数值型包装类:已经由Number类定义了拆箱的方法了
|- Boolean型:public boolean booleanValue();
范例:以int和Integer为例:
public class SSS { public static void main(String [] args){ Integer obj = new Integer(10); //装箱 int x = obj.intValue(); //拆箱 System.out.println(x*2); } }
Integer是int数据类型的包装类
范例:以double和Double为例:
public class SSS { public static void main(String [] args){ Double obj = new Double(10.1); //装箱 double x = obj.doubleValue(); //拆箱 System.out.println(x*2); } }
从JDK1.9之后,对包装类提供的构造方法加上了@Deprecated过期处理,不建议用户继续使用,这是因为在JDK1.5之后,为了方便使用,提供了自动装箱与拆箱的操作,所以这种手工的模式基本上没人用了。
范例:观察自动装箱和拆箱
public class SSS { public static void main(String [] args){ Integer obj = 10; //自动装箱 int num = obj; //自动拆箱 obj ++; //包装类可以直接进行数学运算 System.out.println(num * obj); } }
除了提供有这种自动的数学运算支持之外,使用自动装箱的最大好处是可以实现Object接受基本数据类型的操作
范例:Object接收小数:
public class SSS { public static void main(String [] args){ Object obj = 16.2; //double自动装箱为Double,然后向上转型为Object double num = (Double)obj; //向下转型后再自动拆箱 System.out.println(num*2); } }
但是对于包装类需要注意一些问题了,关于相等判断上:
范例:观察相等判断
public class SSS { public static void main(String [] args){ Integer x = 99; Integer y = 99; System.out.println(x == y); //true } }
public class SSS { public static void main(String [] args){ Integer x = 128; Integer y = 128; System.out.println(x == y); //false
System.out.println(x.equals(y)); //true
}
}
以后进行包装类相等判断的时候一定要是用equals()方法完成,而包装类本身也需要考虑占位的长度,如果超过了一位的内容,就需要使用equals()比较。