包装类
就是将基本数据类型封装到类中。
包装类的产生原因:Object类可以接收所有引用数据类型。然而在Java中,数据类型分为基本数据类型和引用数据类型,为了使用Object接收一切东西,引出了包装类.
自己定义一个包装类
public class Test {
public static void main(String[] args) {
Object obj = new IntDemo(10);//向上转型
fun(obj);
}
public static void fun(Object obj){
IntDemo temp = (IntDemo) obj;//向下转型
System.out.println(temp.intValue());
}
}
class IntDemo{
private int num;
public IntDemo(int num){
this.num = num;
}
public int intValue(){
return this.num;
}
}
通过包装类可以看出基本数据类型也可以像引用类型一样使用Object接收.这个时候的IntDemo实际上就是int数据类型的包装类,利用IntValue()就可以实现基本数据类型变为对象的需求。
Java中有8种数据类型,如果每种数据类型都按照以上方式编写,存在以下问题:
1. 开发中代码重复
2. 在进行数学计算的时候,必须利用明确的方法将包装的数据取出后才可以进行运算。
所以Java为了方便开发,专门提供了包装类的使用,而对于包装类的使用,提供了两种类型。
- 对象型(Object的直接子类):Boolean、Character(char);
- 数值型(Number的直接子类):Byte、Double、Short、Long、Integer(int)、Float;
装箱与拆箱
在包装类与基本数据类型处理之中存在有两个概念:
装箱:将基本数据类型变为包装类对象。利用每个包装类提供的构造方法实现
拆箱:将包装类中包装的基本数据类型取出,利用xxValue();方法
Integer num = new Integer(10);//装箱
int data = num.intValue();//拆箱
以上操作采用的是手工的装箱和拆箱。在JDK1.5之后,提供了自动拆装箱的机制,最为重要的是,由于此类机制的
存在,可以直接利用包装类的对象进行各种数学计算。
Integer num = 10;
System.out.println(num + 10);
这个时候依然存在有"==" 和 "equals" 问题
看一个例子
Integer i1 = 10;
Integer i2 = 10;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1 == i2);//true
System.out.println(i3 == i4);//false
System.out.println(i3.equals(i4));//true
说明:对于 Integer var = ? 在-128 至 127 范围内的赋值,Integer 对象是在IntegerCache.cache 产生,会复用已有对
象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会
复用已有对象,这是一个大坑,推荐使用 equals 方法进行判断。
阿里编码规范:所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较。
对于什么时候使用包装类,什么时候使用基本数据类型,这里也给出阿里编码规范:
1.[强制]:所有POJO类(简单java类,类中只有成员变量、构造方法、getter/setter)属性必须使用包装类
2.[强制]:RPC方法返回值和参数必须使用包装类
3.[推荐]:所有的局部变量使用基本类型
包装类与字符串的转换
以后要进行各种数据的输入,一定都是字符串类型的接收。所以在开发之中,如何将字符串变为各个数据类型,这个时候就需要包装类支持。
1.String变为基本数据类型 包装类.parseInt(字符串)
String str = "123";
int num = Integer.parseInt(str);//将字符串转int
double num2 = Double.parseDouble(str);//将字符串转double
System.out.println(num);
System.out.println(num2);
/**
* 输出
* 123
* 123.0
*/
注意: 将 字 符 串 转 为 数 字 的 时 候 , 字 符 串 的 组 成 有 非 数 字 , 那 么 转 换 就 会 出 现 错误(NumberFormatException),而字符串与boolean转换就不受此影响。
String str = "true";
boolean bool = Boolean.parseBoolean(str);
System.out.println(bool);
字符串内容除了true外,其他内容转成boolean都是false.
将基本数据类型转成字符串有2种方法:
1.使用"+" (str + 基本数据类型 )
2.String类提供的静态方法 valueOf(基本类型)
int num = 10;
String str = String.valueOf(num);
System.out.println(str);
这里推荐第二种,因为第二种方法不会产生垃圾空间.