方式 1:使用new
关键字(最常见)
class Person {
String name;
public Person() {
this.name = "默认名称";
System.out.println("调用构造方法创建对象");
}
}
public class Main {
public static void main(String[] args) {
Person person1 = new Person(); // 直接使用 new 关键字创建对象
System.out.println("对象 name:" + person1.name);
}
}
方式 2:使用Class.newInstance()
(反射,已过时)
public class Main {
public static void main(String[] args) throws Exception {
Class<?> clazz = Person.class;
Person person2 = (Person) clazz.newInstance(); // 通过反射创建对象(已过时)
System.out.println("反射创建对象 name:" + person2.name);
}
}
方式 3:使用Constructor.newInstance()
(推荐的反射方式)
import java.lang.reflect.Constructor;
public class Main {
public static void main(String[] args) throws Exception {
Constructor<Person> constructor = Person.class.getConstructor();
Person person3 = constructor.newInstance(); // 通过 Constructor 反射创建对象
System.out.println("Constructor 反射创建对象 name:" + person3.name);
}
}
方式 4:使用clone()
方法
class Person implements Cloneable {
String name;
public Person(String name) {
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // 直接克隆对象
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Person person4 = new Person("张三");
Person clonedPerson = (Person) person4.clone(); // 通过 clone 方法创建对象
System.out.println("原对象 name:" + person4.name);
System.out.println("克隆对象 name:" + clonedPerson.name);
}
}
注意:clone()
方法必须实现Cloneable
接口,否则会抛出CloneNotSupportedException
。
方式 5:使用反序列化
import java.io.*;
class Person implements Serializable { // 必须实现 Serializable 接口
String name;
public Person(String name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) throws Exception {
// 序列化:将对象保存到文件
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.ser"));
Person person5 = new Person("李四");
out.writeObject(person5);
out.close();
// 反序列化:从文件恢复对象
ObjectInputStream in = new ObjectInputStream(new FileInputStream("person.ser"));
Person deserializedPerson = (Person) in.readObject();
in.close();
System.out.println("反序列化对象 name:" + deserializedPerson.name);
}
}
注意:
Serializable
接口必须实现,否则无法序列化。- 反序列化可以在不调用构造方法的情况下创建对象。