什么是包装类呢?
通俗的说,包装类就是将基本类型封装到类中。举个例子:
class IntDemo{
private int value;
//通过构造方法把value封装到IntDemo这个类中
public IntDemo(int value){
this.value = value;
}
//再通过intValue()这个方法取出来
public int intValue(){
return this.value;
}
}
public class Test {
public static void main(String[] args) {
Object obj = new IntDemo(10);
//如果要进行运算,还得把10取出来
IntDemo demo = (IntDemo) obj;
int data = demo.intValue();
System.out.println(data+10);
}
}
如果我们每个项目都自己写包装类的话,会特别麻烦,加大了工作量,效率也不高,况且上面的只是int的包装类,而Java中一共有八个基本数据类型,每个写一遍的话,重复代码会特别多。
所以Java中专门提供了一个包装类,把所有基本类型对应成它的类。
包装类分为以下两种类型:
数值型(Number的子类):Byte、Short、Integer(int)、Long、Float、Double
对象型(Object的子类):Boolean、Character(char)
装箱与拆箱
装箱:将基本数据类型变为包装类对象,通过每个包装类的构造方法实现装箱处理。
拆箱:将包装类中包装的基本数据类型取出,利用包装类提供的xxValue()方法实现拆箱
例如:Integer提供的intValue()方法。
//装箱
Integer integer = new Integer(10);
//拆箱
int data = integer.intValue();
说了这么多,包装类的初衷到底是啥呢?
之前我们说过,Object类可以接收除了基本类型以外的所有类,现在有了包装类,那么Object就是真的可以接收所有的类了,基本类型也可以。
但是传统的装箱与拆箱使用时特别麻烦,JDK1.5提供了自动拆装箱
//自动装箱
Integer integer = 10;
//自动拆箱(不用调用xxValue()方法可以直接进行运算)
System.out.println(integer+10);
有了自动拆装箱之后,使用包装类与使用基本数据类型在用法上基本一致。那么到底使用哪一种呢?
案例编码规范:
1、【强制】所有POJO类属性必须使用包装数据类型
POJO:简单Java类,类中只有属性与getter/setter,构造方法
2、【强制】RPC方法的返回值和参数必须使用包装数据类型
RPC:远程过程调用
3、局部变量推荐使用基本数据类型
考点:
public class Test {
public static void main(String[] args) {
Integer i1 = 10;
Integer i2 = 10;
Integer i3 = 130;
Integer i4 = 130;
System.out.println(i1 == i2); //true
System.out.println(i3 == i4); //false
}
}
观察上面这段代码,==比较的是地址,按理来说没有新new对象,两个都该是true才对,可是第二个却是false?
原来啊,对于Integer var = ?直接赋值在[-128~127]区间内的值,Integer对象在缓存池产生,会复用已有的对象。而在这个区间外的所有数据均在堆上产生,并且不会复用已有对象。
补充:包装类进行数值比较使用equals方法。
String类如何转成基本数据类型?
使用各个包装类提供的parseXX()方法,例如:Integer.parseInt(str)
public class Test {
public static void main(String[] args) {
String str = "123";
int i = Integer.parseInt(str);
System.out.println(i+10); //133
}
}
注意:
当字符串中包含了非数字,在运行时会抛出NumberFormatException异常。所以在调用Integer.parseInt()方法之前,先判断字符串是否由纯数字组成,怎么判断呢?我们可以把字符串转成字符数组,每个字符判断一下是否在0~9之间。
基本数据类型如何转成String类?
1、使用"+"
2、通过String的构造方法
3、[推荐]:使用String.valueOf(所有基本类型)
System.out.println(String.valueOf(123)+10); //12310