核心原理:自动装箱
Java 是一种强类型的语言,long 是一个基本数据类型,而 Object 是一个引用数据类型,它们之间不能直接赋值。

为了解决这个问题,Java 为每个基本数据类型都提供了一个对应的包装类:
| 基本类型 | 包装类 |
|---|---|
byte |
Byte |
short |
Short |
int |
Integer |
long |
Long |
float |
Float |
double |
Double |
char |
Character |
boolean |
Boolean |
自动装箱 是 Java 5 引入的一个特性,它允许你将一个基本数据类型自动地转换为其对应的包装类对象。
当你尝试将一个 long 值赋给一个 Object 引用时,JVM 会自动调用 Long 类的构造函数或 valueOf 方法,为你创建一个 Long 对象。
// long 是基本类型 long primitiveLong = 12345L; // Object 是引用类型 Object objectRef; // 发生了自动装箱 // 编译器会自动将其转换为: objectRef = Long.valueOf(primitiveLong); objectRef = primitiveLong; // objectRef 的类型实际上是 java.lang.Long System.out.println(objectRef.getClass().getName()); // 输出: java.lang.Long System.out.println(objectRef); // 输出: 12345
主要方法
虽然自动装箱是最简单的方式,但了解其背后的原理也很重要,主要有两种方式手动完成这个转换。

使用 Long 构造函数 (最传统)
这是最直观的方式,显式地使用 Long 类的构造函数来创建一个 Long 对象。
long primitiveLong = 98765L; // 手动使用构造函数 Long longObject = new Long(primitiveLong); // 然后可以将 Long 对象赋给 Object Object objectRef = longObject; System.out.println(objectRef.getClass().getName()); // 输出: java.lang.Long System.out.println(objectRef); // 输出: 98765
注意:从 Java 9 开始,Long(long) 这个构造函数被标记为 @Deprecated(已弃用),官方推荐使用 Long.valueOf(long) 方法,因为它可以利用缓存机制,提高性能并减少内存占用。
使用 Long.valueOf() (推荐)
这是目前推荐的手动转换方式。valueOf() 方法会返回一个 Long 实例,对于在 [-128, 127] 范围内的 long 值,它会返回一个预先缓存好的对象,而不是创建新的实例,这有助于节省内存。
long primitiveLong = 100L; // 推荐使用 valueOf() 方法 Long longObject = Long.valueOf(primitiveLong); // 然后可以将 Long 对象赋给 Object Object objectRef = longObject; System.out.println(objectRef.getClass().getName()); // 输出: java.lang.Long System.out.println(objectRef); // 输出: 100
最佳实践与代码示例
在实际开发中,你应该优先使用自动装箱,因为它代码更简洁、可读性更高,只有在需要显式表达意图或进行特定优化时,才考虑手动调用 valueOf。

完整示例
public class LongToObjectExample {
public static void main(String[] args) {
// 1. 定义一个 long 基本类型变量
long myLong = 20251027L;
// 2. 方法一:使用自动装箱(最推荐,最简洁)
// 这是最常见、最地道的方式
Object obj1 = myLong;
System.out.println("自动装箱结果:");
System.out.println("类型: " + obj1.getClass().getName());
System.out.println("值: " + obj1);
System.out.println("--------------------");
// 3. 方法二:手动使用 Long.valueOf()(推荐的手动方式)
// 在某些情况下,显式调用可以增强代码可读性
Object obj2 = Long.valueOf(myLong);
System.out.println("手动使用 valueOf 结果:");
System.out.println("类型: " + obj2.getClass().getName());
System.out.println("值: " + obj2);
System.out.println("--------------------");
// 4. 方法三:使用已弃用的构造函数(不推荐,仅作了解)
// 虽然仍可用,但应避免在新代码中使用
// Long longObj = new Long(myLong);
// Object obj3 = longObj;
// System.out.println("使用构造函数结果:");
// System.out.println("类型: " + obj3.getClass().getName());
// System.out.println("值: " + obj3);
}
}
输出结果:
自动装箱结果:
类型: java.lang.Long
值: 20251027
--------------------
手动使用 valueOf 结果:
类型: java.lang.Long
值: 20251027
--------------------
反向操作:Object 转 long
理解了 long 转 Object,反向操作也同样重要,当你从一个 Object 引用中获取 long 值时,你需要进行拆箱操作。
前提是:这个 Object 必须是一个 Long 类型的实例,否则会抛出 ClassCastException。
Object obj = 123L; // 这个 obj 实际上是一个 Long 对象
// 1. 安全的方式:先检查类型
if (obj instanceof Long) {
// 向下转型,并自动拆箱为 long
long value = (Long) obj;
System.out.println("安全转换后的值: " + value);
} else {
System.out.println("对象不是 Long 类型,无法转换。");
}
// 2. 不安全的方式:直接强制转换
// obj 不是 Long 类型,这里会抛出 ClassCastException
// long value = (Long) obj;
| 转换方向 | 方法 | 代码示例 | 备注 |
|---|---|---|---|
long -> Object |
自动装箱 (首选) | Object obj = 123L; |
代码简洁,推荐使用。 |
Long.valueOf() |
Object obj = Long.valueOf(123L); |
手动方式,推荐用于显式表达。 | |
new Long() (已弃用) |
Object obj = new Long(123L); |
传统方式,不推荐在 Java 9+ 中使用。 | |
Object -> long |
检查类型后转换 | if (obj instanceof Long) { long val = (Long) obj; } |
安全的方式,避免 ClassCastException。 |
| 直接强制转换 | long val = (Long) obj; |
不安全,如果类型不匹配会抛出异常。 |
核心要点:
long转Object的本质是装箱,将基本类型变为Long对象。- 自动装箱是首选,因为它最简单、最符合现代 Java 编码风格。
Long类是long的包装类,是转换过程中的桥梁。- 反向转换时,务必检查
Object的实际类型,以避免运行时错误。
