浅拷贝:
class Professor { String name; int age; public Professor(String name, int age) { this.name = name; this.age = age; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } class Student implements Cloneable { String name; int age; Professor p; public Student(String name, int age, Professor p) { this.name = name; this.age = age; this.p = p; } @Override protected Object clone() throws CloneNotSupportedException { Student s = (Student) super.clone(); // s.p = (Professor) p.clone(); return s; } } public class Main { public static void main(String[] args) throws CloneNotSupportedException { Professor p = new Professor("教授1", 50); Student s1 = new Student("学生1", 18, p); Student s2 = (Student) s1.clone(); s2.p.name = "教授2"; s2.p.age = 30; s2.name = "学生2"; s2.age = 25; System.out.println(s1.name + " " + s1.age + " " + s1.p.name + " " + s1.p.age); } }
结果: 学生1 18 教授2 30
深拷贝:
class Professor implements Cloneable { String name; int age; public Professor(String name, int age) { this.name = name; this.age = age; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } class Student implements Cloneable { String name; int age; Professor p; public Student(String name, int age, Professor p) { this.name = name; this.age = age; this.p = p; } @Override protected Object clone() throws CloneNotSupportedException { Student s = (Student) super.clone(); s.p = (Professor) p.clone(); return s; } } public class Main { public static void main(String[] args) throws CloneNotSupportedException { Professor p = new Professor("教授1", 50); Student s1 = new Student("学生1", 18, p); Student s2 = (Student) s1.clone(); s2.p.name = "教授2"; s2.p.age = 30; s2.name = "学生2"; s2.age = 25; System.out.println(s1.name + " " + s1.age + " " + s1.p.name + " " + s1.p.age); } }
结果: 学生1 18 教授1 50
序列化形式深拷贝:
class Professor implements Serializable { private static final long serialVersionUID = 1286716519490813020L; String name; int age; public Professor(String name, int age) { this.name = name; this.age = age; } } class Student implements Serializable { private static final long serialVersionUID = -547004870369127943L; String name; int age; Professor p; public Student(String name, int age, Professor p) { this.name = name; this.age = age; this.p = p; } public Object deepClone() throws IOException, ClassNotFoundException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); objectOutputStream.writeObject(this); ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray())); return objectInputStream.readObject(); } } public class Main { public static void main(String[] args) throws IOException, ClassNotFoundException { Professor p = new Professor("教授1", 50); Student s1 = new Student("学生1", 18, p); Student s2 = (Student) s1.deepClone(); s2.p.name = "教授2"; s2.p.age = 30; s2.name = "学生2"; s2.age = 25; System.out.println(s1.name + " " + s1.age + " " + s1.p.name + " " + s1.p.age); } }
结果: 学生1 18 教授1 50