包装类
Java中每一种基本类型都会对应一个唯一的包装类,基本类型与其包装类都可以通过包装类中的静态或者成员方法进行转换。每种基本类型及其包装类的对应关系如下,值得注意的是,所有的包装类都是final修饰的,也就是它们都是无法被继承和重写的。
包装类与基本类型的转换
从源代码的角度来看,基础类型和包装类型都可以通过赋值语法赋值给对立的变量类型,如下面的代码所示。
Integera=1;
inta=newInteger(1);
这种语法是可以通过编译的。但是,Java作为一种强类型的语言,对象直接赋值给引用类型变量,而基础数据只能赋值给基本类型变量,这个是毫无异议的。那么基本类型和包装类型为什么可以直接相互赋值呢?这其实是Java中的一种“语法糖”。“语法糖”是指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会(来自百度百科)。换句话说,这其实是一种障眼法,那么实际上是怎么样的呢?下面是Integera=1;语句编译的字节码。
0:iconst_1
1:invokestatic#2
4:astore_1
首先,生成一个常量1,然后调用Integer.valueOf(int)方法返回Integer对象,最后将对象的地址(引用)赋值给变量a。Integera=1;其实相当于Integera=Integer.valueOf(1);。
其他的包装类都是类似的,下表是所有包装类中的类型转换方法。
“神奇”的包装类
如果不了解包装类中的一些机制,我们有时会碰到一些莫名其妙的问题,丈二和尚——摸不着头脑。
“莫名其妙”的NullPointException
在笔者开发经历中,碰到过不少因为请求参数或者接口定义字段设置为int(或者其他基本类型)而导致NullPointException。代码大致地运行步骤如下所示,当然不会跟这个完全一样。
Integera=null;
...
intb=a;//抛出NullPointException
上面的代码可以编译通过,但是会抛出空指针异常(NullPointException)。前面已经说过了,intb=a实际上是intb=a.intValue(),由于a的引用值为null,在空对象上调用方法就会抛出NullPointException。
两个包装类引用相等性
在Java中,“==”符号判断的内存地址所对应的值得相等性,具体来说,基本类型判断值是否相等,引用类型判断其指向的地址是否相等。看看下面的代码,两种类似的代码逻辑,但是得到截然不用的结果。
这个必须从源代码中才能找到答案。Integer类中的valueOf()方法的源代码如下:
由于1属于[-128,127]集合范围内,所以valueOf()每次都会取出同一个Integer对象,故第一个“==”判断结果为true;而222不属于[-128,127]集合范围内,所以valueOf()每次都会创建一个新的Integer对象,由于两个新创建的对象的地址不一样,故第一个“==”判断结果为false。
以上就是动力节点java培训机构的小编针对“Java核心基础,java包装类数据”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习