java 的装箱拆箱_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是一个本地方法,它会去内存中检查是否有这个常量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值