在一个论坛上看到了一个关于深浅拷贝的文章,引用地址:[url]http://bbs.itcast.cn/thread-14646-1-2.html[/url]
[color=red][size=medium][b]概念:[/b][/size][/color]
(1)浅拷贝(浅克隆)被复制对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用仍然只指向原来的对象。
(2)深拷贝(深克隆)被复制对象的所有变量都含有与原来的对象相同的值,那些引用其他对象的变量将指向被复制过的新对象,深复制把要复制的对象所引用的对象都复制了一遍。
[color=red]实现拷贝需要实现Cloneable接口并且重写clone方法。[/color]
(1)如果类型仅包含值类型(int,byte等类型)和string类型的数据成员,我们只要在clone方法中初始化一个新的对象,并调用超类的方法clone方法。
(2)如果自定义类型包含引用类型的数据成员,必须考虑clone方法是实现浅拷贝(shallow copy)还是深拷贝(deep copy)。
话不多说:贴代码:
[color=red][size=medium][b]概念:[/b][/size][/color]
(1)浅拷贝(浅克隆)被复制对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用仍然只指向原来的对象。
(2)深拷贝(深克隆)被复制对象的所有变量都含有与原来的对象相同的值,那些引用其他对象的变量将指向被复制过的新对象,深复制把要复制的对象所引用的对象都复制了一遍。
[color=red]实现拷贝需要实现Cloneable接口并且重写clone方法。[/color]
(1)如果类型仅包含值类型(int,byte等类型)和string类型的数据成员,我们只要在clone方法中初始化一个新的对象,并调用超类的方法clone方法。
(2)如果自定义类型包含引用类型的数据成员,必须考虑clone方法是实现浅拷贝(shallow copy)还是深拷贝(deep copy)。
话不多说:贴代码:
package test.clone;
public class Person implements Cloneable{
String name;
String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public Object clone() {
Person p=null;
try{
p=(Person) super.clone();
}catch(CloneNotSupportedException e) {
e.printStackTrace();
}
return p;
}
}
package test.clone;
public class Student implements Cloneable{
Person person;
String klass;
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public String getKlass() {
return klass;
}
public void setKlass(String klass) {
this.klass = klass;
}
@Override
public Object clone() {
Student obj = null;
try {
obj = (Student) super.clone();
} catch (CloneNotSupportedException ex) {
ex.printStackTrace();
}
obj.person=(Person)person.clone();//如果没有这句则属于浅拷贝;读者可以自行测试
return obj;
}
}
package test.clone;
public class TestClone {
public static void main(String[] args) {
Student s1=new Student();
Person p1=new Person();
p1.setName("Student1");
p1.setAge("21");
s1.setKlass("class1");
s1.setPerson(p1);
Student s2=(Student) s1.clone();
s2.getPerson().setName("Student2");
System.out.println(s1.getPerson().getName()+"------克隆之前的Student1");
System.out.println(s2.getPerson().getName()+"------克隆之后的Student2");
}
}
运行结果:
Student1------克隆之前的Student1
Student2------克隆之后的Student2