定义
java有8种基本数据类型,对应的是8种包装类型:
基本类型 | 包装类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Char |
以Integer为例,通常我们使用new关键字创建一个实例:
Integer t = new Integer(10);
对于基本类型的包装类型,如下方法也是行的通的
Integer t = 10;
这种直接将基本类型转换为包装类型的过程,我们称之为装箱。
反过来,我们可以直接给一个基本类型的数据赋值包装类型:
Integer t = new Integer(10);
int n = t;
这个过程称之为拆箱。
如何实现的
通过查看class文件,可以看到封箱和拆箱的具体实现:
装箱
BIPUSH 10
INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
ASTORE 1
装箱实际调用了Integer.valueOf方法
拆箱
ALOAD 1
INVOKEVIRTUAL java/lang/Integer.intValue ()I
ISTORE 2
拆箱实际调用了Integer.intValue方法
为什么要设计包装类型
包装类的继承关系
首先看一下类的继承关系
Number
源码注释是对类最好的解释,重要程度不亚于源码,甚至比源码更重要,看一下Number的注释:
/**
* The abstract class {@code Number} is the superclass of platform
* classes representing numeric values that are convertible to the
* primitive types {@code byte}, {@code double}, {@code float}, {@code
* int}, {@code long}, and {@code short}.
*
* The specific semantics of the conversion from the numeric value of
* a particular {@code Number} implementation to a given primitive
* type is defined by the {@code Number} implementation in question.
*
* For platform classes, the conversion is often analogous to a
* narrowing primitive conversion or a widening primitive conversion
* as defining in <cite>The Java™ Language Specification</cite>
* for converting between primitive types. Therefore, conversions may
* lose information about the overall magnitude of a numeric value, may
* lose precision, and may even return a result of a different sign
* than the input.
*
* See the documentation of a given {@code Number} implementation for
* conversion details.
*
* @author Lee Boynton
* @author Arthur van Hoff
* @jls 5.1.2 Widening Primitive Conversions
* @jls 5.1.3 Narrowing Primitive Conversions
* @since JDK1.0
*/
翻译成中文:
Number是可以转换为基本类型数据的类的父类。
定义了从Number特定实现的数值到给定的基本类型的转换。
对于java类,在基本类型之间的相互转换时,对基本类型的扩大和缩小转换总是类似的,
因此,转换会丢失关于数值的完整信息,或者丢失精确度,甚至返回与输入值符号不同的结果。
可以了解到,Number类的出现,主要是为了解决使用基本类型相互转换时的精度问题。BigDecimal和BigInteger都是Number的子类,解决了大数的数学运算。