Java的自动装箱和拆箱

定义

java有8种基本数据类型,对应的是8种包装类型

基本类型包装类型
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
booleanBoolean
charChar

以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 intValue() doubleValue() others() Integer Double Others

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&trade; 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类的出现,主要是为了解决使用基本类型相互转换时的精度问题。BigDecimalBigInteger都是Number的子类,解决了大数的数学运算。

从Number的子类源码中,我们可以学到什么?

Integer

Java:Integer源码心得.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值