基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。
一般我们要创建一个类的对象的时候,我们会这样:
Class a = new Class(parameter);
装箱:
当我们创建一个Integer对象时,却可以这样:
Integer i = 100; (注意:不是 int i = 100; )
Integer i = 100实际上是 Integer i = Integer.valueOf(100);此即基本数据类型的自动装箱功能。
PS:当 Integer i = XX XX不在valueOf的范围(-128~127)内时,Integer i = XX归根结底就是Integer i = new Integer(XX)
拆箱:
Integer i = new Integer(333);
int j = i;//自动取出其值
InvalueOf源码如下:
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
当方法的参数小于等于127和大约等于-128时,会始终只在内存中存在一个相同数值的对象,
Integer i = 100;
Integer j = 100;
i和j指会向同一个对象。
不明白的可以再去看看Integer中的私有类IntegerCache,第一次初始化的时候它就会造出来256个对象。
装箱和拆箱的例子,从基本类型对应的类到Object的转换,也是装箱和拆箱的一个用法:
class fu{
int i=1111;
}
class zi extends fu{
int j =2222;
}
public class Test {
/**
* @param args
*/
public static void main(String args[]) {
Integer a=new Integer(333);
m31(a);
zhuangxiangTest(new zi());
Integer c = new Integer(128);
Object s = c;
Integer x = (Integer) s;//这一句是为了试一下Integer x = s;会不会“拆箱”,结果证明同其它的父子继承一样,不转换类型会报错
System.out.println(s);
}
public static void m31(Object i) {
System.out.println(i.getClass());//这里不需要转换,自动就转换了
}
public static void zhuangxiangTest(fu x) {
zi i = (zi)x;//多一步转换否则下面这句是行不通的
System.out.println(i.j);
}
}
另外:
String str = "a"也是装箱,应该相当于String str = "a".intern();
intern是一个本地方法,它会去内存中检查是否有这个常量。