包装类
- 包装类是为了解决基本类型不能在直接参与面向对象开发的问题
- 8个基本类型对应8个不同的包装类,其中6个表示数字的包装类继承自java.lang.Number,其他两个继承自Object
- 包装类是不可变类,在构造了包装类对象后,不允许更改包装在其中的值
包装类是final的
,不能定义他们的子类
基本类型 | 基本类型 | 父类 |
---|---|---|
int | java.lang.Intger | java.lang.Number |
long | java.lang.Long | java.lang.Number |
double | java.lang.Double | java.lang.Number |
short | java.lang.Short | java.lang.Number |
float | java.lang.Float | java.lang.Number |
byte | java.lang.Byte | java.lang.Number |
char | java.lang.Character | java.lang.Object |
boolean | java.lang.Boolean | java.lang.Object |
valueOf方法 (打包)
public class IntegerDemo {
public static void main(String[] args) {
int d = 127;
//Integer i1 = new Integer(d);
//Integer i2 = new Integer(d);
/*
* java推荐我们使用包装类的静态方法:
* valueOf来将基本类型转换为包装类
*/
Integer i1 = Integer.valueOf(d);
Integer i2 = Integer.valueOf(d);
System.out.println(i1 == i2); //true
System.out.println(i1.equals(i2)); //true
}
}
当valueOf(数值)中,数值小于128时,不会创建新对象,会重复运用已有的对象,
i1==i2(true),若大于128则会新建对象i1 == i2(false),
intValue方法 (拆包)
public class IntegerDemo {
public static void main(String[] args) {
int d = 128;
Integer i1 = Integer.valueOf(d);
int i = i1.intValue();
System.out.println(i); //128
byte b = i1.byteValue();
System.out.println(b); //-128
}
}
拆包时由于128超过了byte的取值范围,会取到byte的最小值-128(详细见二进制)
MAX_VALUE(最大)、MIN_VALUE(最小)常量
- MAX_VALUE,MIN_VALUE分别记录了其对应的基本类型的取值范围
public class IntegerDemo2 {
public static void main(String[] args) {
int imax = Integer.MAX_VALUE;
System.out.println(imax); //int的最大取值
int imin = Integer.MIN_VALUE;
System.out.println(imin); //int的最小取值
}
}
parseXXX方法
- 包装类提供了一个功能,静态方法:parseXXX,该方法可以将字符串解析为对应的基本类型数据,前提是该字符串能正确描述要转换的基本类型可以保存的值
public class IntegerDemo2 {
public static void main(String[] args) {
String str = "123";
int a = Integer.parseInt(str);
double d = Double.parseDouble(str);
System.out.println(a); //123
System.out.println(d); //123.0
}
}
如果str = “123.123”,则int a = Integer.parseInt(str);会报错,不是int类型
自动拆装箱
- JDK5之后推出一个新的特性:自动拆装箱,该特性是编译器认可的,而不是虚拟机,编译器在看到有基本类型与包装类之间互相赋值时会添加转换代码将他们转换
public class IntegerDemo3 {
public static void main(String[] args) {
/*
* 这里触发了编译器自动拆箱特性,代码会被编译器改为:
* int i= new Integer(1).intValue();
*/
int i= new Integer(5);
/*
* 触发自动装箱特性,代码会被改为:
* Integer in = Integer.valueOf(i);
*/
Integer in =i;
}
}