浅谈java深浅拷贝
在一个论坛上看到了一个关于深浅拷贝的文章,引用地址:http://bbs.itcast.cn/thread-14646-1-2.html
概念:
(1)浅拷贝(浅克隆)被复制对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用仍然只指向原来的对象。
(2)深拷贝(深克隆)被复制对象的所有变量都含有与原来的对象相同的值,那些引用其他对象的变量将指向被复制过的新对象,深复制把要复制的对象所引用的对象都复制了一遍。
实现拷贝需要实现Cloneable接口并且重写clone方法。
(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------克隆之前的Student1Student2------克隆之后的Student2