Java Number类与自动装箱拆箱机制原理剖析?
- 内容介绍
- 文章标签
- 相关推荐
本文共计599个文字,预计阅读时间需要3分钟。
原文:
在 Java 中,Number 是一个抽象基类,位于 java.lang 包中,定义了所有数值包装类(如 Integer、Double、Long 等)的公共契约。它本身不能被实例化(即 new Number() 编译不通过),但可作为统一的引用类型,指向其任意具体子类对象。
关键在于:以下代码看似“直接赋值基本类型给抽象类”,实则触发了 Java 的自动装箱(Autoboxing)机制:
Number x = 3; // ✅ 合法 —— 编译器自动转换为:Number x = Integer.valueOf(3);
此处并非“向上转型”(upcasting)原始类型,也不是“解包”(unboxing),因为 3 是 int 字面量,而 Number 不是 int 的父类(原始类型无继承关系)。真实过程是:
- 编译期自动装箱:3 → Integer.valueOf(3) → 返回一个 Integer 实例;
- 运行时多态绑定:该 Integer 对象被安全地赋值给 Number 类型引用(因 Integer extends Number);
- 方法调用动态分派:x.intValue() 和 x.doubleValue() 实际调用的是 Integer 类中重写的版本(Integer.intValue() 直接返回内部 int value;Integer.doubleValue() 执行 int → double 的宽化原始类型转换,精度无损)。
本文共计599个文字,预计阅读时间需要3分钟。
原文:
在 Java 中,Number 是一个抽象基类,位于 java.lang 包中,定义了所有数值包装类(如 Integer、Double、Long 等)的公共契约。它本身不能被实例化(即 new Number() 编译不通过),但可作为统一的引用类型,指向其任意具体子类对象。
关键在于:以下代码看似“直接赋值基本类型给抽象类”,实则触发了 Java 的自动装箱(Autoboxing)机制:
Number x = 3; // ✅ 合法 —— 编译器自动转换为:Number x = Integer.valueOf(3);
此处并非“向上转型”(upcasting)原始类型,也不是“解包”(unboxing),因为 3 是 int 字面量,而 Number 不是 int 的父类(原始类型无继承关系)。真实过程是:
- 编译期自动装箱:3 → Integer.valueOf(3) → 返回一个 Integer 实例;
- 运行时多态绑定:该 Integer 对象被安全地赋值给 Number 类型引用(因 Integer extends Number);
- 方法调用动态分派:x.intValue() 和 x.doubleValue() 实际调用的是 Integer 类中重写的版本(Integer.intValue() 直接返回内部 int value;Integer.doubleValue() 执行 int → double 的宽化原始类型转换,精度无损)。

