java装箱拆箱

基本数据类型的自动装箱(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是一个本地方法,它会去内存中检查是否有这个常量。

posted @ 2013-11-11 20:25  剑握在手  阅读(197)  评论(0编辑  收藏  举报
返回顶部↑