深拷贝见博客 原型模式 深拷贝
当需要创建大量相同或者相似的对象时,可以通过对一个已有对象的复制获取更多对象。
1. 浅拷贝
被复制对象的所有普通成员变量具有与原来对象相同的值,而所有对其他对象的引用仍然指向原来的对象。
在下面的示例代码中,email实例对象中有指向附件Attachment的实例对象,在浅拷贝中,这个附件对象是不会复制的。代码中会有== 和 equals的验证。
2.浅拷贝步骤
在java中,可以通过覆盖Object类的clone()方法实现浅拷贝。步骤如下:
一、子类覆盖父类的clone()方法
二、在clone方法中,调用super.clone()
三、子类实现Cloneable接口,这个接口是标识接口,它只是让JRE知道这个类具有克隆功能。
package 设计模式.原型模式.浅拷贝;
/**
* Created by jason on 2018/1/17.
*/
public class Test {
public static void main(String[] args) {
Cat cat1 = new Cat("ha","8");
try {
Cat cat2 = (Cat) cat1.clone();
} catch (CloneNotSupportedException e) {
System.out.println("cat clone 出错");
}
//如果Cat不实现Cloneable接口,是不能复制的。Cloneable和Serialize是标识接口
try {
Email email = new Email();
Email copyEmail = (Email) email.clone();
System.out.println(email == copyEmail);
System.out.println(email.equals(copyEmail)); //没有重写equals方法,导致这里的equals方法和==是一样的
System.out.println(email.getAttachment() == copyEmail.getAttachment());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
class Email implements Cloneable{
private Attachment attachment;
public Email(){
this.attachment = new Attachment();
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public Attachment getAttachment(){
return attachment;
}
public void display(){
System.out.println("查看邮件");
}
}
class Attachment{
public void download(){
System.out.println("下载附件");
}
}
输出:false
false
true
Cat类 Cat不实现Cloneable接口
package 设计模式.原型模式.浅拷贝;
/**
* Created by jason on 2018/1/17.
*/
public class Cat{
public String name;
public String age;
public Cat(String name, String age) {
this.name = name;
this.age = age;
}
public Cat() {
}
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 String toString() {
return "Cat{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}