装箱拆箱
1)基本数据类型和对应的包装类
2)装箱拆箱定义
装箱:就是将基本数据类型转换为包装类类型;
拆箱:就是将包装类类型转换为基本数据类型。
包装类:在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。
3)代码实现
一.装箱
int a=10;
Integer b=Integer.valueOf(a);
上面的代码其实就是装箱的过程,就是把基本数据类型装换为Integer类型,这里调用了一个Integer类下的静态方法,如下面代码所示:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
可以看到它返回的是一个Integer类型的对象,所以这样我们就实现了装箱
二.拆箱:
Integer b=Integer.valueOf(a);
int c= b.intValue();
上面代码就是进行一个拆箱,可见调用了Integer类下的一个方法intValue,其作用就是返回b的值,并且此类型为int,讲解一下转换过程如下:
private final int value;
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
public Integer(int value) {
this.value = value;
}
public int intValue() {
return value;
}
上面的代码就是在装箱拆箱会使用到的方法,这些方法都是包装类Integer类下的方法,首先我们在装箱的时候会调用valueOf方法,可以看到此方法返回的是Integer对象,因为在实例化的同时会进行构造方法的调用,所以我们就会调用Integer的构造放法,对Integer的成员变量进行初始化,此时Integer类下的成员变量value就初始化好你在装箱时赋的值,然后在拆箱时会调用intValue方法,这个方法就是把初始化好的value值返回,并且可以看到value的类型和intValue的返回类型均为基本数据类型int,此时就把Integer类型转换为int了
4)题目讲解(深入理解)
public static void main(String[] args) {
Integer a=127;
Integer b=127;
Integer c=128;
Integer d=128;
System.out.println(a==b);
System.out.println(c==d);
}
答案的结果a等于b,c不等于d
解释:首先我们要明确的是==号是比较什么的,==号是比较地址的,java为了减少新建对象的消耗,然后java已经创建了一个数值为[-128,127]的对象,也可以类型宇String的常量池,所以我们就可以解释上面的答案了,由于a和b是127在[-128,127]范围内,所以指向java已经有这个数值的地址了,由于其指向的地址一样,结果为true,同理,c和d由于都超过了范围,所以java就没有提供现有的地址空间让其指向,所以c和d就只能new一个新的空间,因此其地址就会不同。
下图可以理解一下new这里