一、Java创建对象主要有四种方法,直接上代码~
// 案例使用类
public class Person implements Cloneable, Serializable {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@NonNull
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Test {
public static void main(String[] args) {
// 方式1 new关键字
Person person1 = new Person("abc", 10);
System.out.println("person1 name: " + person1.getName() + ", age: " + person1.getAge());
// 方式2 反射 即使构造方法是私有的也可以通过反射创建
Class<?> clazz = Person.class;
try {
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
Object person2 = constructor.newInstance("abc", 10);
if (person2 instanceof Person) {
System.out.println("person2 name: " + ((Person) person2).getName() + ", age: " + ((Person) person2).getAge());
}
} catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
e.printStackTrace();
}
// 方式3 clone 类需要实现Cloneable接口,覆写Object.clone()方法来改变可见性
Person personRaw = new Person("abc", 10);
try {
Person person3 = (Person) personRaw.clone();
System.out.println("person3 name: " + person3.getName() + ", age: " + person3.getAge());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
// 方式3 反序列化 类需要实现Serializable接口,反序列化不走构造方法
Person personOutput = new Person("abc", 10);
try {
// 序列化
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("person.txt"));
outputStream.writeObject(personOutput);
// 反序列化
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("person.txt"));
Person person4 = (Person) inputStream.readObject();
System.out.println("person4 name: " + person4.getName() + ", age: " + person4.getAge());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
输出
person1 name: abc, age: 10
person2 name: abc, age: 10
person3 name: abc, age: 10
person4 name: abc, age: 10
参考