Java对象包装器与自动装箱

本文讲解了Java中基本类型到对象包装器的转换过程,包括自动装箱和拆箱的机制,包装类的注意事项,以及如何避免直接修改包装类值的问题。通过实例演示了持有者类型如IntHolder的使用,以及编程中的常见陷阱和解决方案。
摘要由CSDN通过智能技术生成

Java对象包装器与自动装箱

有时候,需要将int这样的基本类型转换为对象。所有的基本类型都有与之对应的类。例如,Integer类对应基本类型int。通常,这些类称为包装器(wrapper)。

自动装箱:

list.add(3);(自动转换)=> list.add(Integer.valueOf(3)); // 这种变换称为自动装箱。      

自动拆箱:

int n = list.get(i); // 将一个Integet对象赋值给一个int ,自动拆箱。

包装类注意要点:

Integer a = 1;
Integer b = 1;
if(a == b) { // 这里不会自动拆箱,所以比较的是对象的地址值
    ...
}
Integer n = null;
System.out.println(2 * n); // throws NullPointerException
Integer n = 1;
Double x = 2.0;
System.out.println(true ? n : x); // print 1.0
// 如果在一个表达式中混合使用Integer和Double类型,Integer值就会自动拆箱,提升为double,再装箱为Double。

最后再强调以下,装箱和拆箱的编译器要做的工作,而不是虚拟机。编译器在生成字节码的时候会插入必要的方法调用。虚拟机只是执行这些字节码。

**注意:**包装器类是不可以改变的,即一旦构造的包装器,就不允许改变包装在其中的值。同时,包装器类还是final,因此不能派生他们的子类。

举例:

public static void main(String[] args) {
	int n = 1;
	triple(n);
	System.out.println(n); // print 1
}

public static void triple(int x) {
	x = 3 * x;
}

java方法的参数是按值传递,只是传进去一个副本,而没有改变原来的值。

将int替换为Integer:

public static void main(String[] args) {
	Integer n = 1;
	triple(n);
	System.out.println(n); // print 1
}

public static void triple(Integer x) {
	x = 3 * x;
}

包装类对象的值不允许改变。

解决问题的方法:

可以使用org.omg.CORBA包中定义的某个持有者类型,例如IntHolder、BooleanHolder等。每个持有者类型都包含一个公共字段value,通过它可以访问存储在其中的值。

public static void main(String[] args) {
	IntHolder n = new IntHolder(1);
	triple(n);
	System.out.println(n.value); // print 3
}

public static void triple(IntHolder x) {
	x.value = 3 * x.value;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值