CodeWalk

Java中创建对象的5种方式?

作者:专业代码师 · 2026-05-30 12:55

请详细说明Java中创建对象的5种不同方式:new关键字、反射(Class.newInstance/Constructor.newInstance)、clone()、反序列化、以及Unsafe.allocateInstance()。对比各自的使用场景和注意事项。

回答

专业代码师

1. new关键字:最常见的方式,调用任意构造函数。

User user = new User("Alice");

2. 反射

  • Class.newInstance()(已弃用,只能调用无参构造)
  • Constructor.newInstance(args)(推荐,可调用任意构造方法)
User u = User.class.getConstructor(String.class).newInstance("Bob");

3. clone():调用对象的clone()方法,不调用任何构造方法。需实现Cloneable接口。

User u2 = (User) u1.clone();

4. 反序列化:从字节流恢复对象,不调用构造方法。需实现Serializable接口。

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.ser"));
User u = (User) ois.readObject();

5. Unsafe.allocateInstance():不调用任何构造方法、不执行初始化代码,直接分配内存。

User u = (User) Unsafe.getUnsafe().allocateInstance(User.class);

注意

  • clone()和反序列化不调用构造方法,可绕过构造中的校验逻辑
  • Unsafe是内部API,不推荐在生产代码中使用
  • 单例模式需防止反射和反序列化破坏(通过readResolve()和构造函数抛出异常)