浅谈java深浅拷贝
程序员文章站
2022-07-06 09:14:26
...
在一个论坛上看到了一个关于深浅拷贝的文章,引用地址: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)。
话不多说:贴代码:
概念:
(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------克隆之前的Student1 Student2------克隆之后的Student2
上一篇: 使用序列化方法实现list集合的深拷贝