目录
一、包装类简介:
- Java数据类型中的基本数据类型不具备数据特征:没有属性、方法,不能对象交互。
- 通过包装类可以使基本数据类型具备数据特征:拥有属性、方法,可以对象交互。
基本类型 | 对应的包装类 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
- Java中的包装类存放在 java.lang 包中。
- Java中的包装类是不允许被继承、无子类的。
- 基本类型中, 数值型的包装类继承自Number类,字符型和布尔型的包装类继承自Object类。
- 包装类对象的初始值是 null 。
二、装箱和拆箱:
- 装箱:把基本数据类型的值转换成对应的包装类对象
- 拆箱:把包装类对象转换成对应的基本数据类型的值。
例:
public class Wrap1 {
public static void main(String[] args) {
//装箱:
//1.自动装箱
int a1=2;
Integer a2=a1;
//2.手动装箱
Integer a3=new Integer(a1); //构造函数
//测试
System.out.println("int类型变量a1="+a1);
System.out.println("Integer类型对象a2="+a2);
System.out.println("Integer类型变量a3="+a3);
System.out.println("=========================");
//拆箱:
//1.自动拆箱
int a4=a2;
//2.手动拆箱
int a5=a2.intValue(); //该方法把Integer对象值转换为整型对象的值
//测试
System.out.println("Integer类型变量a2="+a2);
System.out.println("int类型对象a4="+a4);
System.out.println("int类型变量a5="+a5);
double a6=a2.doubleValue(); //包装类转double型
System.out.println("手动拆箱后,double型变量a6="+a6);
}
}
三、通过包装类使基本数据类型和字符串互转:
例:
public class Wrap2 {
public static void main(String[] args) {
//基本数据类型转换为字符串
int b1=22;
String b2=Integer.toString(b1);
//测试
System.out.println("int型转换为String型对象b2="+b1);
System.out.println("=========================");
//字符串转基本数据类型
//法1:使用包装类的parse...()方法
int b3=Integer.parseInt(b2);
//法2:先使用包装类的valueOf()方法装箱:字符串对象转包装类对象。再拆箱:包装类对象转基本数据类型。
int b4=Integer.valueOf(b2);
//测试
System.out.println("String型转换为int型对象b3="+b3);
System.out.println("String型转换为int型对象b4="+b4);
}
}
四、包装类对象间的比较:
例:
public class Wrap3 {
public static void main(String[] args) {
Integer a=new Integer(100); //手动装箱
Integer b=new Integer(100);
System.out.println("a==b的结果是:"+(a==b)); // Ⅰ
Integer c=100; //自动装箱 A
System.out.println("c==100的结果是:"+(c==100)); // Ⅱ
Integer d=100; //B
System.out.println("c==d的结果是:"+(c==d)); // Ⅲ
Integer e=200;
System.out.println("e==200的结果是:"+(e==200)); // Ⅳ
Integer f=200;
System.out.println("e==f的结果是:"+(e==f)); // Ⅴ
}
}
分析:
Ⅰ:在Java中,若==两侧是对象,则比较的是对象在内存中的引用,不仅仅是值 。而通过new关键字的实例化操作会在内存中开辟一块新的空间,故a和b指向不同的2块内存空间。
Ⅱ:注意:“ c==100; ”是一个自动拆箱的操作,故==比较的是整型数值。
Ⅲ:实际上,编译器对于 “ Integer d=100; ” 执行的操作是 “ Integer d=Integer.valueOf(100); ”。Java在进行自动拆/装箱时,核心就是valueOf()方法。而在valueOf()方法执行过程中,有一个缓存区(常量池),如果传进来的参数满足:-128<参数<127,会直接在缓存区中查找是否存在这样一个对象。若存在一个这样的对象,将会直接产生该对象;若无,会隐式地调用new关键字去实例化一个这样的对象。
因为前面A处的语句已隐式执行了 “ Integer d=Integer.valueOf(100); ”,已在缓存区构建了一个值为100的int型对象。于是B处语句会直接在缓存区找到该对象,就这样 c 和 d 指向了缓存区中的同一块空间,故c==d。
Ⅴ:注意此时参数已不满足:-128<参数<127,跳过,直接隐式地调用new关键字去实例化一个这样的对象。
Java的8种基本数据类型对应的包装类中,除了Float 和 Double ,其他的都可以应用常量池。
public class Wrap3 {
public static void main(String[] args) {
Double x=Double.valueOf(100);
System.out.println("x==100的结果是:"+(x==100));
Double y=Double.valueOf(100);
System.out.println("x==y的结果是:"+(x==y));
}
}