天天看点

Java包装类与泛型

Java包装类与泛型

  • ​​1.什么是包装类​​
  • ​​2.为什么需要包装类​​

1.什么是包装类

首先应该知道Java有基本类型与非基本类型

基本类型包含四类八种:

整型:

int

long

short

byte

浮点型:

double

float

布尔型:

boolean

字符型:

char

基本类型在Java语言中的地位很高,是关键字差不多一级的。

每一个基本类型都有自己的包装类:

Integer

Long

Short

Byte

Double

Float

Boolean

Character

@Test
  public void method(){
    System.out.println(int.class.getName());
    System.out.println(Integer.class.getName());
    System.out.println(boolean.class.getName());
    System.out.println(Boolean.class.getName());
    System.out.println(double.class.getName());
    System.out.println(Double.class.getName());
    System.out.println(float.class.getName());
    System.out.println(Float.class.getName());
    System.out.println(long.class.getName());
    System.out.println(Long.class.getName());
    System.out.println(byte.class.getName());
    System.out.println(Byte.class.getName());
    System.out.println(short.class.getName());
    System.out.println(Short.class.getName());
    System.out.println(char.class.getName());
    System.out.println(Character.class.getName());
  }      
int
java.lang.Integer
boolean
java.lang.Boolean
double
java.lang.Double
float
java.lang.Float
long
java.lang.Long
byte
java.lang.Byte
short
java.lang.Short
char
java.lang.Character
      

2.为什么需要包装类

在Java中,面向对象编程的思想中,一个方法应该尽可能的抽象。

比如我写一个方法,只能处理int类型的数据。

另一个方法能够处理所有整形的数据。

还有一个方法能够处理任意类型的数据。

那么第三种方法的抽象程度就比较高,使用的范围就大,使用的地方就会多。

那么如何表示任意类型呢?

有人说可以用Object类型。

是,所有的类都是Object类的子类。

但是,如果是基本类型呢?基本类型与Object可不是同一类。

所以,为了解决这一个问题,jdk就封装了所有的包装类,每一个基本类型对应一个包装类。

同时因为包装类支持对自己对应的基本类型的自动装箱,所以实际在使用的时候基本上无法对int与Integer的自动装箱做出感知。

例子:

@Test
  public void method1(){
    int i = 3;
    System.out.println((Object)i);
  }      

编译为class文件后,使用反编译软件进行查看:

@Test
  public void method1() {
    int i = 3;
    System.out.println(Integer.valueOf(i));
  }      

可以看到Integer对int做了自动的装箱。

有自动装箱就有自动拆箱

@Test
  public void method2(){
    Integer mInteger = 3;
    System.out.println((int) mInteger);
  }      

编译后class文件:

@Test
  public void method2() {
    Integer mInteger = Integer.valueOf(3);
    System.out.println(mInteger.intValue());
  }      

可以看到自动装箱是通过包装类的valueOf方法实现,自动拆箱通过intValue实现。

所以,使用上述方法可以实现手动装箱与拆箱。

所以,包装类的存在的第一个原因就是为了统一基本类型与Object的关系,通过包装类弱化基本类型的特殊性。

对于抽象的方法,如果使用Object对象作为参数,那么实际方法实现的时候需要使用instanceof来判定实例对象所属的类,然后使用强类型转换转换为需要的类。因为对将要处理的类的不确定性,此方式无法适应所有的类,只能兼容有限的类,而且对于开闭原则非常不友好,所以jdk在1.5版本中新增了泛型。

泛型的本质就是对任意一个类的实例进行如下处理:

1.声明方法的参数类型为Object,

2.使用时参数为任意类型,因为基本类型的自动装箱的存在,所有的类型都是Object的子类,

3.编译器自动进行类型转换。

所以,泛型就是对类型的擦除。

继续阅读