Java的数据类型分两种:
基本类型:byte,short,int,long,boolean,float,double,char
引用类型:class,interface
引用类型可以赋值为null,表示空,但基本类型不能赋值为null:
String s = null; int n = null; //comile error!
那么,如何把一个基本类型视为对象(引用类型)?
比如,想要把int基本类型变成一个引用类型,我们可以定义一个integer类,
它只包含一个实例字段int,这样,Integer类就可以视为int的包装类(Wrapper class):
public class Integer { private int value; public Integer(int value) { this.value = value; } public int intValue() { return this.value; } }
定义好Integer类,我们就可以把int和Integer互相转换:
Integer n = null; Integer n2 = new Integer(99) //将int转换为Integer int n3 = n2.inValue(); //将integer转换为int
实际上,因为包装类非常有用,Java核心库为每种基本类型都提供了对应的包装类型:
我们可以直接使用,并不需要自己去定义:
public class catchExample2 { public static void main(String[] args) { int i = 100; // 通过new操作符创建Integer实例,这种方式,会有编译警告; Integer n1 = new Integer(i); // 可以通过静态方法valueOf创建Integer实例; Integer n2 = Integer.valueOf(i); // 通过静态方法valueOf(String)创建Integer也是可以的; Integer n3 = Integer.valueOf("100"); System.out.println(n3.intValue()); } }
因为int和Integer可以互相转换:
int i = 100; Integer n = Integer.valueOf(i); int x = n.inValue(); // 所以,Java编译器可以帮助我们自动在int和Integer之间转型: Integer n = 100; //编译器自动使用Integer.valueOf(int) int x = n; //编译器自动使用Integer.inValue()
这种直接把int变为Integer的赋值写法,称为自动装箱(Auto Boxing),
反过来,把Integer变为int的赋值写法,称为自动拆箱(Auto Unboxing)。
注意,自动装箱和自动拆箱只发生在编译阶段,目的是为了减少代码。
装箱和拆箱会影响代码的执行效率,因为编译后的class代码是严格区分基本类型和引用类型的。
并且自动拆箱执行时可能会报NullPointerExecption。
所有的包装类型都是不变类。
public final class Integer { private final int value; }
因此,一旦创建了Integer对象,该对象就是不变的。
我们在创建integer的时候,有两种方法:
Integer n = new Integer(100); Integer n = Integer.valueOf(100);
前者总是创建新的对象,后者方法更优。
我们将能创建新对象的静态方法称为静态工厂方法,
Integer.valueOf()就是静态工厂方法,它尽可能地返回缓存地实例以节省内存。
Integer类本身还提供了大量方法,例如,最常用地静态方法parseInt()可以把字符串解析成一个整数:
int x1 = Integer.parseInt("100"); // 100 int x2 = Integer.parseInt("100", 16); // 256,因为按16进制解析
Integer还可以把整数格式化为指定进制地字符串:
public class Main { public static void main(String[] args) { System.out.println(Integer.toString(100)); // "100",表示为10进制 System.out.println(Integer.toString(100, 36)); // "2s",表示为36进制 System.out.println(Integer.toHexString(100)); // "64",表示为16进制 System.out.println(Integer.toOctalString(100)); // "144",表示为8进制 System.out.println(Integer.toBinaryString(100)); // "1100100",表示为2进制 } }