1.浅复制与深复制概念
⑴浅复制(浅克隆)
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
⑵深复制(深克隆)
⑴浅复制(浅克隆)
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
⑵深复制(深克隆)
被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
2.浅复制与深复制范例
// 浅复制
@Entity
public class Student implements Cloneable {
String grade;
People p;
Student(String grade, People p) {
this.grade = grade;
this.p = p;
}
public Object clone() {
Object o = null;
try {
o = (Student) super.clone();// Object 中的clone()识别出你要复制的是哪一个对象。
} catch (CloneNotSupportedException e) {
System.out.println(e.toString());
}
return o;
}
public static void main(String[] args) {
People p = new People("lbc", 26);
Student s1 = new Student("1", p);
Student s2 = (Student) s1.clone();
s2.grade = "2";
s2.p.age = 0;
// 修改学生2后,不影响学生1的值。但是P的值同时改变
System.out.println("grade=" + s1.grade + "," + "age=" + s1.p.age);
System.out.println("grade=" + s2.grade + "," + "age=" + s2.p.age);
}
}
class People {
String name;
Integer age;
People(String name, Integer age) {
this.name = name;
this.age = age;
}
}
输出:
grade=1,age=0
grade=2,age=0
//深复制
@Entity
public class Student implements Cloneable {
String grade;
People p;
Student(String grade, People p) {
this.grade = grade;
this.p = p;
}
@Override
public Object clone() {
Student o = null;
try {
o = (Student) super.clone();// Object 中的clone()识别出你要复制的是哪一个对象。
} catch (CloneNotSupportedException e) {
System.out.println(e.toString());
}
o.p = (People) p.clone();
return o;
}
public static void main(String[] args) {
People p = new People("lbc", 26);
Student s1 = new Student("1", p);
Student s2 = (Student) s1.clone();
s2.grade = "2";
s2.p.age = 0;
// 修改学生2后,不影响学生1的值。
System.out.println("grade=" + s1.grade + "," + "age=" + s1.p.age);
System.out.println("grade=" + s2.grade + "," + "age=" + s2.p.age);
}
}
class People implements Cloneable {
String name;
Integer age;
People(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public Object clone() {
Object o = null;
try {
o = (People) super.clone();
} catch (CloneNotSupportedException e) {
System.out.println(e.toString());
}
return o;
}
}
输出:
grade=1,age=26
grade=2,age=0
从输出可以看出,现在s1和s2完全独立互不影响,正如开头定义所说的:深复制把要复制的对象所引用的对象都复制了一遍。
注意:参考http://www.jb51.net/article/62909.htm