Java 创建对象的 6 种方式 + 底层原理(面试必考)

Java 创建对象的 6 种方式(底层 + 面试版)

一、6 种创建方式总览

  • new 关键字
  • Class.newInstance ()(反射,已废弃)
  • Constructor.newInstance ()(标准反射)
  • clone () 克隆
  • 反序列化
  • Unsafe.allocateInstance ()(底层)

二、详细说明(Markdown 格式)

1. new 关键字(最常用)

User user = new User();

  • 调用构造方法
  • 最直观、最常用
  • 触发 JVM 类加载 + 内存分配 + 初始化

2. Class.newInstance ()(反射,废弃)

User user = User.class.newInstance();

  • 反射创建
  • 必须有无参构造
  • JDK9 已废弃

3. Constructor.newInstance ()(推荐反射方式)

Constructor ctor = User.class.getConstructor();
User user = ctor.newInstance();

  • 灵活:支持有参 / 无参
  • 推荐使用
  • 会调用构造方法

4. Object clone ()(克隆)

User user1 = new User();
User user2 = (User) user1.clone();

  • 不调用构造方法
  • 浅拷贝
  • 必须实现 Cloneable 接口

5. 反序列化

ObjectInputStream ois = new ObjectInputStream(...);
User user = (User) ois.readObject();

  • 从流中恢复对象
  • 不调用构造方法
  • 必须实现 Serializable

6. Unsafe.allocateInstance ()(JVM 底层)

Unsafe unsafe = Unsafe.getUnsafe();
User user = (User) unsafe.allocateInstance(User.class);

  • 完全不调用构造方法
  • 只分配堆内存,不初始化
  • 属于 JVM 底层机制

三、哪些调用构造方法?哪些不调用?

✅ 调用构造方法

  • new
  • Class.newInstance()
  • Constructor.newInstance()

❌ 不调用构造方法

  • clone()
  • 反序列化
  • Unsafe.allocateInstance()

四、JVM 创建对象底层流程(面试必考)

  1. 检查类是否已加载
  2. 堆内存分配
  3. 初始化零值(成员变量默认值)
  4. 设置对象头(Mark Word、指针、锁信息、GC年龄)
  5. 执行构造方法 ()

五、Java 对象内存布局(JVM 必考)

对象头(Header)
→ Mark Word
→ 类型指针
实例数据(Instance Data)
→ 成员变量
对齐填充(Padding)
→ 保证 8 字节对齐

六、面试终极答案:new 对象时 JVM 做了什么?

  1. 检查类加载
  2. 堆分配内存
  3. 零值初始化
  4. 设置对象头
  5. 执行构造方法
posted @ 2026-03-05 19:44  七星6609  阅读(0)  评论(0)    收藏  举报