自动装拆箱
基本数据类型自动装换为对应的封装类就是自动装箱,封装类自动转换为对应的基本数据类型就是自动拆箱。
自动装拆箱不需要用new关键字来创建对象,也无需调用intValue()
方法,基本数据类型直接转换为引用类型,引用类型直接转换为基本数据类型。
package com.sw.t2;
public class Test1 {
public static void main(String[] args) {
/* int i = 100;//定义一个整型变量i=100
Integer i1 = new Integer(i);//用Integer的构造方法创建对象把int型的数据转换成它的封装类
int i2 = i1.intValue();//使用intValue()方法把封装类型的i1转换成基本数据类型i2;*/
//如果是自动装拆箱的话就可以直接
Integer i1 = 100;
int i2 = i1;
//这一过程中实现了自动装拆箱,
}
}
在上面的自动转拆箱过程中,Integer i1 = 100
就相当于是new Integer(100)
,int i2 = i1
就相当于是int i2 = i1.intValue()
。
package com.sw.t2;
public class Test1 {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1 == i2);//输出true
System.out.println(i3 == i4);//输出false
//出现这种情况是为什么呢?
//根据源码可以知道在Integer中有个内部类它初始化了一个Integer数组范围是-128到127;
//所有当Integer的值在这个范围里面的时候是直接用的这个数组里面的值,
//如果都是100的话就是同一个对象;
//但是当这个值不在这个范围的时候就会调用Integer()构造方法,new了两次对象,
//所以是两个不同的对象,比较的结果也就成了false
}
}
package com.sw.t2;
public class Test1 {
public static void main(String[] args) {
Double i1 = 100.0;
Double i2 = 100.0;
Double i3 = 200.0;
Double i4 = 200.0;
System.out.println(i1 == i2);//输出false
System.out.println(i3 == i4);//输出false
//这个Double类型运行出来的结果,两个都是false
//在源码中查看可以知道Double类型的它是直接就new了一个对象,并没有像
//Integer类型的一样有个数组。
}
}
Short、Byte、Character、Long都和Integer一样会根据数据的大小返回对象,如果在初始化的数组里就返回一个相同的对象,要是不在的话就返回两个不同的对象。
Double和Float类型的则是每一次都会返回不同的对象。