原型模式 浅拷贝

深拷贝见博客 原型模式 深拷贝
当需要创建大量相同或者相似的对象时,可以通过对一个已有对象的复制获取更多对象。
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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值