Java核心类——包装类型

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进制
    }
}

 

posted @ 2020-03-16 00:31  明王不动心  阅读(195)  评论(0编辑  收藏  举报