4.对象包装器与自动装箱
所有的基本类型都有一个与之对应的类。下面以表格的形式展开
基本类型 | 包装器(类) |
---|---|
int | Integer |
long | Long |
float | Float |
double | Double |
short | Short |
byte | Byte |
char | Character |
boolean | Boolean |
前六个类派生于公共的超类(Number)。
包装器类是不可变的:一旦构造了包装器,就不允许更改包装在其中的值。同时,包装器还是final,因此不能派生它们的子类
自动拆装箱
以下自动装箱演示
list.add(3); // ---> 自动转变成list.add(Integer.valueOf(3))
相反
拆箱
int a = list.get(i); // --->自动转变成list.get(i).intValue();
因此在常用运算中也可以使用包装器(类)
关于自动装箱还有几点说明:
由于包装器可以引用为null,所以自动装箱有可能会抛出一个NullPointerException异常
Integer a = null;
System.out.println(a * 2);
如果条件中混合使用Integer和Double类型,Integer值就会拆箱,提升为double,再装箱为Double
Integer a = 1;
Double b = 2.0;
System.out.println(true ? a : b); // 打印 1.0
最后强调一下,装箱和拆箱是编译器要做的工作,而不是虚拟机。编译器在生成类的字节码时会插入必要的方法调用。虚拟机只执行字节码。
java.lang.Integer
int intValue(); //将这个对象的值作为一个int返回
static String toString(int i); //返回一个新的String对象,表示指定i的十进制表示
static String toString(int i,int radix); //返回数值i基于radix参数指定进制的表示
static int parseInt(String s);//返回字符串s表示的整数,指定字符串必须为一个十进制整数
static int parseInt(String s, int radix); //采用radix参数指定的进制
static Integer valueOf(String s);//返回一个新的Integer对象,用字符串s表示整数的初始化.默认十进制
static Integer valueOf(String s,int radix);
演示:
Integer a = 1;
String str = "he";
String str2 = "12";
int b = a.intValue(); //简写 int b = a;
System.out.println(b); //结果:1
String c = a.toString();
System.out.println(c); //结果: "1"
String c2 = Integer.toString(31,16);
System.out.println(c2); //:1f 十六进制数
int s = Integer.parseInt(str2);
System.out.println(s + 1); //结果: 5
int s2 = Integer.parseInt("41",16);
System.out.println(s2); //结果:65
Integer it = Integer.valueOf("4");
System.out.println(it); //结果 4
Integer it2 = Integer.valueOf("41",16);
System.out.println(it2); // 65