Java的装箱和封箱

来源:互联网 发布:mac 涂层脱落 编辑:程序博客网 时间:2024/04/27 19:41

Java的自动装箱和封箱虽然看似比较简单,但有些需要注意的地方。

在赋值的时候,分两种情况。

1.将基本类型赋值给基本类型的代理类型。
如Integer i = 3;
这是一个自动装箱的过程。
需要对应的与之相符的类型被赋值过去。
但是,特殊情况:
当右边是int,而左边是比int数值范围更小的时候(如Short、Byte、Character),编译器会先尝试将int转化为对应的基本类型,再进行装箱。除此之外,类型不同,则不能装箱。
2.将代理类型赋值给对应的基本类型。
如int i = new Integer(3);
这时候,会将右边的对象自动拆箱,变成基本类型,在尝试去赋值。
注意,此时,如果左边的取值范围比较大的时候,也没有问题。
如double d = new Integer(4);//实际上先转化为int 4,再转化为double 4;
和double d = 4是同样的效果。

个人理解,装箱的过程比较严格。即便右边的数值范围比较小,类型不同也不能赋值。
如:Long l = 3;应该是 Long l = 3L;因此,他不能类型自动提升。
拆箱过程中,因为编译器首先已经将箱子拆开了, 已经变成基本类型了。再赋值就可以自动类型提升了。

在函数调用的时候(泛型类似):
编译器会自动间基本类型和其所对应的基本类型的代理类进行装箱封箱。类型不一致,是不可以滴。
注意了,如果Integer和int在函数的参数里还是不同滴,因此,func(int)和func(Integer)还是可以滴。
又注意了,在调用方法的过程中,如果一个低数值范围的数字基本类型被当作参数的时候,他寻找方法的顺序是这样的。
(1) 先找有没有和自身类型参数一致的方法。
(2) 类型提升,找有没有比自身数值范围大的方法。
(3) 进行装箱,找有没有装箱后符合条件的方法。
又又注意了,基本类型的代理类类型作为参数,顺序是这样的。
(1)编译器会首先找该类型的方法。
(2)对其进行拆箱,再找。
(3)进行类型提升,再找。

对于泛型来说是,类似的。但是泛型里只能声明类,不能声明基本类型。

总之,自动类型提升只是针对基本类型来说的。装箱之后,是不能进行类型提升的。
1 0
原创粉丝点击