java中如何创建对象
在Java中创建对象的方法
使用 new 关键字
最常见的对象创建方式是使用 new 关键字调用构造函数。
ClassName objectName = new ClassName();
示例:
public class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
// 创建对象
Person person = new Person("Alice", 25);
使用 Class.newInstance()(已废弃)
Java 9 之后 Class.newInstance() 被废弃,推荐使用 Constructor.newInstance()。
Class<?> clazz = Class.forName("com.example.Person");
Person person = (Person) clazz.newInstance(); // 已废弃
使用 Constructor.newInstance()
通过反射机制调用构造方法创建对象。
Class<?> clazz = Class.forName("com.example.Person");
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
Person person = (Person) constructor.newInstance("Bob", 30);
使用 clone() 方法
如果类实现了 Cloneable 接口,可以通过 clone() 方法复制现有对象。
public class Person implements Cloneable {
String name;
int age;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
Person person1 = new Person("Charlie", 35);
Person person2 = (Person) person1.clone();
使用反序列化
通过 ObjectInputStream 从字节流中恢复对象,前提是该类实现了 Serializable 接口。
public class Person implements Serializable {
String name;
int age;
}
// 序列化对象
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
oos.writeObject(new Person("Dave", 40));
}
// 反序列化对象
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person person = (Person) ois.readObject();
}
使用工厂方法
通过静态工厂方法返回对象实例。
public class Person {
private String name;
private int age;
private Person(String name, int age) {
this.name = name;
this.age = age;
}
public static Person createPerson(String name, int age) {
return new Person(name, age);
}
}
Person person = Person.createPerson("Eve", 45);
使用 Lambda 表达式(函数式接口)
适用于函数式接口(仅含一个抽象方法的接口)。
@FunctionalInterface
interface PersonFactory {
Person create(String name, int age);
}
PersonFactory factory = Person::new; // 构造函数引用
Person person = factory.create("Frank", 50);
总结
new是最直接的方式。- 反射适用于动态创建对象。
clone()适用于复制已有对象。- 反序列化适用于持久化存储恢复对象。
- 工厂方法提供更灵活的对象构造方式。
Lambda适用于函数式接口的场景。







