找回密码
 立即注册
首页 业界区 安全 Java 创建对象的 6 种方式 + 底层原理(面试必考) ...

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

高小雨 3 小时前
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 创建对象底层流程(面试必考)


  • 检查类是否已加载
  • 堆内存分配
  • 初始化零值(成员变量默认值)
  • 设置对象头(Mark Word、指针、锁信息、GC年龄)
  • 执行构造方法 ()
五、Java 对象内存布局(JVM 必考)

对象头(Header)
→ Mark Word
→ 类型指针
实例数据(Instance Data)
→ 成员变量
对齐填充(Padding)
→ 保证 8 字节对齐
六、面试终极答案:new 对象时 JVM 做了什么?


  • 检查类加载
  • 堆分配内存
  • 零值初始化
  • 设置对象头
  • 执行构造方法

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册