java设计模式之原型模式,如何实现深克隆

创建一个Sheep2的类,实现Cloneable接口。以下是具体代码:

import java.util.Date;
public class Sheep2 implements Cloneable{

	private String sname;
	private Date birthday;
	
	
	@Override
	protected Object clone() throws CloneNotSupportedException {
		Object obj =super.clone();		//直接调用object对象的clone方法!
		
		//添加如下代码,实现深复制(deep clone)
		Sheep2 s =(Sheep2)obj;
		s.birthday =(Date) this.birthday.clone();	//把属性叶克隆
		
	//	System.out.println(obj==s);
		
		return obj;	//在这里,s与obj指向的是同一个对象
	}


	public String getSname() {
		return sname;
	}


	public void setSname(String sname) {
		this.sname = sname;
	}


	public Date getBirthday() {
		return birthday;
	}


	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}


	public Sheep2(String sname, Date birthday) {
		super();
		this.sname = sname;
		this.birthday = birthday;
	}
	
	public Sheep2() {
	}
}

值得一提的是,在clone()方法中,返回的是obj,而不是s,(两者其实并没有区别,如注释中所说,这两者在内存中指向的是同一个对象)。System.out.println(obj==s);的结果为true!

然后,创建测试用例Client2,以下为具体代码:

import java.util.Date;

public class Client2 {

	public static void main(String[] args) throws Exception {
		Date date =new Date(1655464864484L);		
		
		Sheep2 s1 =new Sheep2("哆啦A梦",date);
		Sheep2 s2 =(Sheep2) s1.clone();			//实现深复制,s2的birthday是一个新对象
		
		System.out.println(s1);				//输出s1对象
		System.out.println(s1.getSname());		//输出s1对象的名称
		System.out.println(s1.getBirthday());		//输出s1对象的生日
		
		date.setTime(165464854984654L);			//改变s1对象的生日
		
		System.out.println(s1.getBirthday());		//输出
		
		s2.setSname("哆啦B梦");
		System.out.println(s2);				//输出s2对象
		System.out.println(s2.getSname());		//输出s2对象的名称
		System.out.println(s2.getBirthday());		//输出s2对象的生日(结果为原生日,并没有被改变)
	}
}

编译并运行

输出结果:

prototype.Sheep2@3ce53108
哆啦A梦
Fri Jun 17 19:21:04 CST 2022
Thu May 16 19:43:04 CST 7213
prototype.Sheep2@2afa3ac1
哆啦B梦
Fri Jun 17 19:21:04 CST 2022


可以看出,s1与s2为两个完全不同的对象,但有着相同的属性。

且,改变s1的date后,s2的date并没有改变,说明s2有着自己的date对象,即复制了s1原来的date对象。(若是浅克隆,是不会另外再复制一个date对象的。)

以上,两者之间,实现了深克隆。


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值