对象包装器和自动装箱

本文介绍了Java中对象包装器的概念及其应用,包括Integer等类如何对应基本数据类型,并详细解释了自动装箱和自动拆箱的过程及注意事项。

对象包装器和自动装箱

有时,需要将int这样的类型转化为对象。所有的基本类型都有一个与之对应的类。例如,Integer类对应基本类型int。通常,这些类称为包装器(wrapper)。这些对象包装器拥有很明显的名字:IntegerLongFloatDoubleShortByteCharacterVoidBoolean(前6个类派生于公共的超类Number)。对象包装器类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。同时,对象包装器还是final,因此不能定义它们的子类。
例如:

ArrayList<Integer> list = new ArrayList<>();

下面这个调用:

list.add(3);

将自动地变成:

list.add(Integer.valueOf(3));

这种变换被称为自动装箱
相反地,当将一个Integer类型对象赋值给一个int值时,将会自动拆箱。也就是说,编译器将下列语句:

int n = list.get(i);

翻译成:

int n = list.get(i).intValue();

关于自动装箱还有以下几点需要说明。首先,由于包装器类引用可以为null,所以自动装箱可能会抛出一个NullPointerException

Integer n = null;
System.out.println(2 * n); // Throws NullPointerException

另外,如果在一个表达式中混合使用IntegerDouble类型,Integer值就会拆箱,提升为double,再装箱为Double

Integer n = 1;
Double x = 2.0;
System.out.println(true ? n : x); // Prints 1.0

最后,自动装箱和拆箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码时,插入必要的方法调用。虚拟机只是执行这些字节码。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值