前言
有时,需要将int这样的基础数据类型转换为对象,所有的基础数据类型都有一个与之对应的类,称为包装类(或者包装器),这些包装类的有其名字如下:
基本数据类型对应的包装类名
基本数据类型 | 包装类 |
int | Integer |
short | Short |
long | Long |
byte | Byte |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
包装类同String类一样,是不可变的,一旦构造了包装类对象 ,就不能改变对应包装类中的属性。同时包装类是被final修饰的类,因此不能用来派生子类(不能被继承)。
java.lang包中的Integer类在对象中包装了一个基本数据类型,它包含一个int类型的字段。此外,Integer类中还包含了很多方法,用来处理int类型的数据,例如将int和String类型之间相互转化的方法等。
不只是int类型,long,short类型都可以封装成一个类,这些类都是Number的子类。
Integer的内部结构
Integer类型里面提供了一下四个常量
1、MAX_VALUE
表示int类型可取的最大值,即
2、MIN_VALUE
表示int类型可取的最小值,即
最大值,对应的十进制,八进制,和二进制,十六进制
最小值,对应的十进制,八进制,和二进制,十六进制
其使用如下:
public class Test { public static void main(String[] args) { int a = Integer.MAX_VALUE; int b = Integer.MIN_VALUE; System.out.println("the value of Integer.MAX_VALUE is: " + a); System.out.println("the value of Integer.MIN_VALUE is: " + b); } }
打印结果为:
3、SIZE
SIZE用来以二进制补码的形式表示int值的位数(int包装类位数为32,short包装类的SIZE为16)
例如:
public class Test { public static void main(String[] args) { int SIZEOfInteger = Integer.SIZE; System.out.println("the value of Integer.SIZE is: " + SIZEOfInteger); } }
4、TYPE
表示基本数据类型int的Class实例,可以通过TYPE来验证Integer类的常量
构造方法
Integer中有一个常量value,是被final修饰的类型,也就是在构造函数对其进行初始化之后就无法修改的常量。
1、Integer(int number)
语法如下:
Integer a = new Integer( int number )
将一个int类型的数据作为参数传入其中来构建一个Integer对象
2、Integer(String str)
Integer a = new Integer( String str )
将一个String对象作为参数传入其中, 然后调用parseInt(String s,int radix)方法,将传入的字符串作为参数,将其转化为对应的int类型的数据,然后赋值给value
注意:
对于这种传入String对象的情况,str的内容必须为数值类型的字符串,否则将会抛出NumberFormatException 异常。
3.引用为null
包装类也可以不进行初始化,将其引用设置为null。但也因此会在使用他的时候抛出空指针NullPointerException异常:
Integer tem = null;
System.out.println( 1 * tem );
装、拆箱
首先,装箱和拆箱都不是虚拟机的工作,而是编译器。编译器生成字节码,虚拟机来执行这些字节码。
装箱
对于一个列表ArrayList< x > ,如果我们想要存放int类型的数据,是不能直接写成:ArrayList的,因为<>尖括号中的内容是不允许为基本数据类型的,只能用一个类,例如包装类,或者自己自定义的类等。如ArrayList。
但是java中有一个特性能很方便的将int类型直接作为对象的形式添加到ArrayList中去:调用:
List.add(2);
自动转化为:
List.add( Integer.valueOf(2))
Integer.valueOf(x) 返回一个value值为x的Integer对象。然后传入List中去,这种转换称为自动装箱
拆箱
反过来,也当然存在拆箱
将一个Integer对象赋值给int类型的变量的时候,会自动拆箱,也就是会经历如下过程:执行:
int a = List.get(i);
转换为:
int a = List.get(i).intValue();
intValue()方法返回调用这个方法的Integer类的value值(也就是其对应的整形值),然后赋值给a变量。
自动装拆箱对于普通的算数表达式也适用。例如:
Integer n = 3;
n++
编译器会将其拆箱,转化为int类型的数据,然后自增,随后进行装箱,再次还原为Integer对象
隐式类型转换
如果一个表达式中同时使用了Integer对象和Double对象,那么Integer对象会拆箱,然后将里面的基础数据类型提升为double,然后在将其装箱为Double对象。例如:
public class Test { public static void main(String[] args) { Integer tem1 = 100; Double x = 2.0; System.out.println(true ? x:tem1); } }
输出结果为2.0;
Integer对象的不可变性
有如下代码:
public static void cal(int x){ x = x + 1; }
我们都知道,形参是实参的一份临时拷贝,实参传进来用形参接收,然后在方法里面改变的是形参,而没有改变实参,所以传进来的实参是不会自增1的。
有些人可能会认为,能通过包装类来实现一个可以改变数值参数的方法,他会自动拆箱和装箱。但事实上是不可以的。例如:
1. public static void cal(Integer x){ 2. x = x + 1; 3. }
因为包装类是无法修改的,Integer对象里面的value值是被final修饰的,是无法修改的。
Integer类超详解-2