在一个论坛上看到了一个关于深浅拷贝的文章,引用地址:
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------克隆之前的Student1
Student2------克隆之后的Student2
分享到:
相关推荐
浅谈Java中Mysql数据库的连接与操作.pdf
浅谈Java优势,关于java优势......
浅谈Java软件测试.pdf
浅谈java中的几种随机数,浅谈java中的几种随机数,浅谈java中的几种随机数,浅谈java中的几种随机数
浅谈Java串行端口技术协议 浅谈JAVA串行端口技术协议 1 一、串行通讯慨述 2 二、RS232通讯基础 2 三、常见的边线方式 2 四、小技巧:如何辨别TXD和RXD端口? 3 五、安装JAVA COMMUNICATIONS API 3 六、通讯前的准备...
Java深浅clone测试代码 流拷贝 Cloneable
浅谈Java的输入输出流.pdf 浅谈Java的输入输出流.pdf
浅谈java代理机制 .txt 浅谈java代理机制 .txt
浅谈Java程序员的存储过程.doc 浅谈Java程序员的存储过程.doc浅谈Java程序员的存储过程.doc
一个ios的深浅拷贝的demo,请多多下载,多谢,多谢。
浅谈Java的输入输出流
浅谈JAVA技术.pdf
浅谈JAVA语言.pdf
ios中深浅拷贝的讲解,通俗移动。深浅拷贝是ios开发人员面试经常会被问到的知识点,看了本文档,相信你回答ios中的深浅拷贝有不一样的认识。
浅谈java面向对象和引用,初学java的一些疑惑点
浅谈Java异常.docx
浅谈Java异常.pdf
浅谈Java中的equals和==Java开发Java经验技巧共6页.pdf.zip
java培训教程-浅谈java虚拟机.pdf
浅谈Java字符串Java开发Java经验技巧共11页.pdf.zip