不说了,直接看代码:
import java.io.*; import java.lang.reflect.Field; class Person implements Cloneable, Serializable{ private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } public String print() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } } public class CreateObj { public static void main(String[] args) { // 第一种方法,直接new一个对象 Person person1 = new Person("Person1", 1); // 第二种方法,使用clone方法 // 首先Person必须实现Cloneable接口 // 接着重写clone()方法,注意类中的引用对象。 Person person2 = null; try { person2 = (Person) person1.clone(); person2.setName("Person2"); person2.setAge(2); } catch (CloneNotSupportedException e) { e.printStackTrace(); } // 第三种方法,使用反射机制 Class<Person> personClass = Person.class; Person person3 = null; try { person3 = personClass.newInstance(); Field[] fields = personClass.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { fields[i].setAccessible(true); if ("name".equals(fields[i].getName())) { fields[i].set(person3, "Person3"); } if ("age".equals(fields[i].getName())) { fields[i].set(person3, 3); } } } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } // 第四种方法,使用ObjectOutputStream和ObjectInputStream // 通过序列化和反序列化复制对象 // 类必须实现Serializable接口 Person person4 = null; try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(person1); ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray())); person4 = (Person) ois.readObject(); person4.setName("Person4"); person4.setAge(4); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println(person1); System.out.println(person2 == null ? "" : person2); System.out.println(person3 == null ? "" : person3); System.out.println(person4 == null ? "" : person4); System.out.println("--------------------------------"); System.out.println(person1.print()); if (person2 != null) System.out.println(person2.print()); if (person3 != null) System.out.println(person3.print()); if (person4 != null) System.out.println(person4.print()); } }运行结果:
createobj.Person@7f31245a createobj.Person@2503dbd3 createobj.Person@4b67cf4d createobj.Person@7ea987ac -------------------------------- Person{name='Person1', age=1} Person{name='Person2', age=2} Person{name='Person3', age=3} Person{name='Person4', age=4}可以看到,四个对象的地址都不相同。
