包装类
JAVA并不是纯面向对象的语言。Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的。但是我们在实际使用中经常需要将基本数据转化成对象,便于操作。
比如:集合的操作中。例如使用Map对象要操作put()方法时,需要传入的参数是对象而不是基本数据类型。为了解决这个不足,在设计类时为每个 基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class) 。
包装类均位于 java.lang 包,包装类和基本数据类型的对应关系如下表所示:
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
int转化成Integer对象
Integer int1 = new Integer(10); // 构造方法
//在jdk9中已经废弃了 Integer int2 = Integer.valueOf(20);
//可以自动装箱
Integer int1 = 10;
Integer对象转化成int
Integer int1 = 10;
int a = int1.intValue();
//可以自动拆箱
int a = int1
字符串转化成Integer对象
Integer int3 = Integer.parseInt("334");
Integer int4 = new Integer("999"); // 构造方法
Integer对象转化成字符串
String str1 = int3.toString();
一些常见int类型相关的常量
System.out.println("int能表示的最大整数:"+Integer.MAX_VALUE);
// 运行结果:
int能表示的最大整数:2147483647
自动装箱与拆箱
自动装箱的过程:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中。
自动拆箱的过程:每当需要一个值时,被装箱对象中的值就被自动地提取出来,没必要再 去调用intValue()和doubleValue()方法。
自动装箱与拆箱的功能事实上是编译器来帮您的忙,编译器在编译时期依您所编写的语法,决定是否进行装箱或拆箱动作。
自动装箱与拆箱的注意点:
所以自动装箱与拆箱的功能是所谓的 “编译器蜜糖”(Compiler Sugar) ,虽然使用这个功能很方便,但在程序运行阶段您得了解Java的语义。例如下面的程序是可以通过编译的:
Integer i = null;
int j = i;
这样的语法在编译时期是合法的,但是在运行时期会有错误,因为这种写法相当于:
Integer i = null;
int j = i.intValue();
null 表示 i 没有参考至任何的对象实体,它可以合法地指定给对象参考名称。由于实际上 i 并没有参考至任何的对象,所以也就不可能操作 intValue() 方法,这样上面的写法在运行时会出现 NullPointerException 错误。
缓存
自动装箱拆箱时,对于-128-127之间的值,编译器仍然会把它当做基本类型处理。
public class test2 {
public static void main(String[] args) {
System.out.println("------在缓存范围内比较--------");
Integer a1 = 127;
Integer a2 = 127;
Integer a3 = new Integer(127);
System.out.println(a1==a2);
System.out.println(a2==a3);
System.out.println("------在缓存范围外比较--------");
Integer a4 = 128;
Integer a5 = 128;
Integer a6 = new Integer(127);
System.out.println(a4==a5);
System.out.println(a5==a6);
}
}
//运行结果:
------在缓存范围内比较--------
true
false
------在缓存范围外比较--------
false
false