Java 创建对象的四种方法
一、使用 new 关键字创建 Animal 对象
Animal.java
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void speak() {
System.out.println("I am an animal named " + name);
}
}
NewMethod.java
/**
* 使用 new 关键字创建 Animal 对象
*/
public class NewMethod {
public static void main(String[] args) {
Animal myAnimal = new Animal("Tom");
myAnimal.speak();
}
}
二、使用反射机制创建对象
Animal.java
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void speak() {
System.out.println("I am an animal named " + name);
}
}
ReflectMethod.java
/**
* 使用反射方法创建对象
*/
public class ReflectMethod {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> animalClass = Class.forName("com.aaaMyNote.createObject.Animal");
Constructor<?> constructor = animalClass.getConstructor(String.class);
Animal animal = (Animal) constructor.newInstance("bob");
animal.speak();
}
}
三、使用对象的克隆创建对象
Animal.java
要实现 Cloneable 接口,并重写 clone 方法
public class Animal implements Cloneable {
private String name;
public Animal(String name) {
this.name = name;
}
public void speak() {
System.out.println("I am an animal named " + name);
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
CloneMethod.java
/**
* 使用对象的克隆创建对象
*/
public class CloneMethod {
public static void main(String[] args) throws CloneNotSupportedException {
Animal animal = new Animal("Bob");
Animal cloneAnimal = (Animal) animal.clone();
cloneAnimal.speak();
}
}
四、使用反序列化方法创建对象
Animal.java
要实现 Serializable 接口
public class Animal implements Cloneable, Serializable {
private String name;
public Animal(String name) {
this.name = name;
}
public void speak() {
System.out.println("I am an animal named " + name);
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
DeserializeMethod.java
/**
* 使用反序列化方法创建对象
*/
public class DeserializeMethod {
public static void main(String[] args) {
// 序列化对象
serializeObject();
// 反序列化对象
deserializeObject();
}
/**
* 先使用 ObjectOutputStream 对象将对象序列化为字节流,
* 然后再使用 FileOutputStream 将字节流写入到文件中。
* 这样的顺序是因为我们首先需要将对象转换为字节流,然后再将字节流写入文件。
*/
private static void serializeObject() {
Animal animal = new Animal("Bob");
try {
// 将字节流写入到文件中
FileOutputStream fileOutputStream = new FileOutputStream("animal.ser");
// 将对象序列化为字节流
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(animal);
objectOutputStream.close();
fileOutputStream.close();
System.out.println("Animal 对象已被序列化");
} catch (IOException e) {
e.printStackTrace();
}
}
private static void deserializeObject() {
try {
FileInputStream fileInputStream = new FileInputStream("animal.ser");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
Animal deserializedAnimal = (Animal) objectInputStream.readObject();
objectInputStream.close();
fileInputStream.close();
System.out.println("Animal 对象已被反序列化");
deserializedAnimal.speak();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}