Java包装类

包装类的基本概念:

  Java是面向对象的语言,但并不是“纯面向对象”的,因为我们经常用到的基本数据类型就不是对象。但是我们在实际应用中经常需要将基本数据转化成对象,以便于操作。比如:将基本数据类型存储到Object[]数组或集合中的操作等等。

  为了解决这个不足,Java在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)。

  包装类均位于java.lang包,八种包装类和基本数据类型的对应关系如表8-1所示:

  在这八个类名中,除了Integer和Character类以外,其它六个类的类名和基本数据类型一致,只是类名的第一个字母大写而已。

      在这八个类中,除了Character和Boolean以外,其他的都是“数字型”,“数字型”都是java.lang.Number的子类。Number类是抽象类,因此它的抽象方法,所有子类都需要提供实现。Number类提供了抽象方法:intValue()、longValue()、floatValue()、doubleValue(),意味着所有的“数字型”包装类都可以互相转型。如图8-1和图8-2所示。

图8-1 Number类的子类

图8-2 Number类的抽象方法

包装类的用途:

  1. 作为和基本数据类型对应的类型存在,方便涉及到对象的操作,如Object[]、集合等的操作。

      2. 包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法(这些操作方法的作用是在基本数据类型、包装类对象、字符串之间提供相互之间的转化!)。

/**
 * 测试包装类Integer
 */
public class Test {
    public static void main(String[] args) {
        //基本数据类型转换为包装类
       Integer a1 = Integer.valueOf(20);
       //包装类转换为基本数据类型
        int a2 = a1.intValue();
        //包装类可以和其他继承Number类的子类对象互相转换
        Double d1 = a1.doubleValue();
        Float f1 = a1.floatValue();
        //字符串转换为包装类
        Integer a3 = Integer.valueOf("30");
        //包装类对象转换为字符串
        String s1 = a3.toString();
    }
}

自动装箱和拆箱:

  基本数据类型和包装类对象转换时虚拟机会自动进行拆箱和装箱。

//自动装箱
Integer in1 = 123;  //等价于Integer in1 = Integer.valueOf(123);
//自动拆箱
int in2 = in1;  //等价于 int in2 = in1.intValue();

前面说过将基本数据类型存储到Object[]数组或集合中的操作

public class Test {

    public static void main(String[] args) {
        //Object是所有类的祖先类,所有类都默认继承自Object,所以Object类对象可以作为所有其他类对象的上转型对象来使用,自然也可以作为包装类对象的上转型对象
        Object object[] = {5,"你好",20.5};    //5自动装箱成为Integer,"你好"自动装箱为String,20.5自动装箱为Double
        for (Object temp:object) {
            System.out.println(temp.getClass());
        }

    }

}
//输出
class java.lang.Integer
class java.lang.String
class java.lang.Double

 PS:Java中高类型转换为低类型要强制类型转换,上面是低类型转换为高类型(Integer->Object等),所以自动转换;但是Object->Integer要强制类型转换!类型转换不是装箱和拆箱操作,不要搞混乱了!

包装类的缓存问题:

//自动装箱
Integer in1 = 123;  //等价于Integer in1 = Integer.valueOf(123);
Integer in2 = 123;
System.out.println(in1 == in2); //在Integer的源码里面,已经缓存了区间[-128,127]里面的Integer[]对象,在这个区间里面的对象直接返回缓存对象引用,不在区间范围就new一个新的Integer对象

Integer in3 = 1234;
Integer in4 = Integer.valueOf(1234);
System.out.println(in3 == in4);

 

posted @ 2019-08-05 12:33  一转身已万水千山  阅读(305)  评论(0编辑  收藏  举报