原型 就好比:一个孙悟空的变出多个一样的孙悟空一样
* java的构件模型直接支持原始模式的。
* 所有的javaBean都继承Object,而Object类提供一个clone方法
* 可以将一个JavaBean对象复制一份。
* 但这个JavaBean必须实现一个标识接口:Cloneable.
* -----------------------
* 克隆满足的条件:
* clone方法将对象复制一份并返还给调用者。所谓“复制”的含义与clone方法是怎么
* 实现的有关。一般而言,clone方法满足以下的描述
* 1.对任何的对象X,都有:X.clone()!=X 克隆对象与原对象不是同一个对象
* 2. X.clone().getClass() == X.getClass() 克隆对象与原对象的类型是一样的
* 3. 如果对象X的equals()方法定义恰当的话,那么X.clone().equals(X) 是成立的。
* (Object类中equals()方法的默认实现是return (this==obj) 也就是说,当两个变量指向同一个对象时才返回true)
模式实现-浅复制和深复制
如下例子:
/**
* 孙大圣
*/
public class Monkey implements Cloneable, Serializable {
private static final long serialVersionUID = -5655707590382020734L;
private int height;
private int weight;
private GoldRingedStaff staff;
private Date birthDate;
public Monkey() {
this.birthDate = new Date();
this.staff = new GoldRingedStaff();
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public GoldRingedStaff getStaff() {
return staff;
}
public void setStaff(GoldRingedStaff staff) {
this.staff = staff;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
//深克隆
// 利用串行化做深复制 (把对象写到流里的过程是串行化(Serilization)过程)
public Object deepClone() throws IOException, ClassNotFoundException {
// 将对象写到流里
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
// 从流里读回来
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
}
//这是浅克隆
@Override
protected Object clone() throws CloneNotSupportedException {
return (Monkey) super.clone();
}
@Override
public String toString() {
return "birthDate=" + birthDate + " height=" + height + " weight="
+ weight + " GoldRingedStaff=" + staff;
}
}
//金箍棒
public class GoldRingedStaff implements Cloneable, Serializable {
private static final long serialVersionUID = -206209645135740010L;
// 高度
private float height = 100.0F;
// 直径
private float diameter = 100.0f;
public GoldRingedStaff() {
}
// 增长和增大
public void grow() {
this.diameter *= 2.0;
this.height *= 2.0;
}
// 缩小和变短
public void shrink() {
this.diameter /= 2.0;
this.height /= 2.0;
}
//移动
public void move(){
}
public float getHeight() {
return height;
}
public void setHeight(float height) {
this.height = height;
}
public float getDiameter() {
return diameter;
}
public void setDiameter(float diameter) {
this.diameter = diameter;
}
@Override
public String toString() {
return "height=" + height + " diameter" + diameter;
}
}
//测试
public class MainApp {
private Monkey money = new Monkey();
void change() throws Exception {
Monkey copyMoney;
Thread.sleep(1000);
copyMoney = (Monkey) money.clone();
System.out.println(" Money="+money);
System.out.println("copyMoney="+copyMoney);
System.out.println("money==copyMoney?"+(money==copyMoney));
System.out.println((money.getStaff() == copyMoney.getStaff())?"money.getStaff() == copyMoney.getStaff()":"money.getStaff() != copyMoney.getStaff()");
Thread.sleep(1000);
System.out.println("---------------deep Copy------------------------------------");
copyMoney = (Monkey) money.deepClone();
System.out.println(" Money="+money);
System.out.println("copyMoney="+copyMoney);
System.out.println("money==copyMoney?"+(money==copyMoney));
System.out.println((money.getStaff() == copyMoney.getStaff())?"money.getStaff() == copyMoney.getStaff()":"money.getStaff() != copyMoney.getStaff()");
}
/**
*
* 浅复制
* 只对当前象进行复制,而不对其引用对象进行提制
* 这说明复制出来的东西不是同一个对象,但是这两个对象所引用的对象却是同一个
*
* 深复制
* 所要复制的对象都要实现 Serializable接口和Cloneable接口
* 这说明复制出来的东西不是同一个对象,而且这两个对象所引用的对象也不是同一个对象
*/
public static void main(String[] args) {
try {
new MainApp().change();
} catch (Exception e) {
e.printStackTrace();
}
//out put 输出如下
/*Money=birthDate=Tue Dec 07 00:28:21 CST 2010 height=0 weight=0 GoldRingedStaff=height=100.0 diameter100.0
copyMoney=birthDate=Tue Dec 07 00:28:21 CST 2010 height=0 weight=0 GoldRingedStaff=height=100.0 diameter100.0
money==copyMoney?false
money.getStaff() == copyMoney.getStaff()
---------------deep Copy------------------------------------
Money=birthDate=Tue Dec 07 00:28:21 CST 2010 height=0 weight=0 GoldRingedStaff=height=100.0 diameter100.0
copyMoney=birthDate=Tue Dec 07 00:28:21 CST 2010 height=0 weight=0 GoldRingedStaff=height=100.0 diameter100.0
money==copyMoney?false
money.getStaff() != copyMoney.getStaff()*/
}
}
分享到:
相关推荐
建筑工地扬尘治理与文明施工检查表.docx
基于java的个性化旅游攻略定制系统设计与实现.docx
数学建模培训资料 数学建模实战题目真题答案解析解题过程&论文报告 导弹追击模型的建立与求解 共6页.pdf
基础课程辅助教学-JAVA-基于springBoot程序设计基础课程辅助教学系统设计与实现
适用人群:大学生 自学者 使用场景:大学生毕设 自学者练手项目 学习与交流 其它说明:部分资源来源网络及开源社区、仅供参考与学习、不可商用、若有侵权请联系删除! 内容概要:用springmvc实现的校园选课管理系统
java课程期末考试
C++ Vigenère 密码(解密代码)
工程研究中心申报基本情况一览表.docx
Vigenère 密码(加密代码)
密码学AES算法源代码,密码学实验
基于java的百货中心供应链管理系统设计与实现.docx
环境说明:开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat 开发软件:eclipse/myeclipse/idea Maven包:Maven 浏览器:谷歌浏览器。 项目均可完美运行
【资源说明】 大数据毕业设计 基于Python+Spark机器学习天气预测系统详细文档+全部资料.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
购物系统 微信小程序+PHP毕业设计 源码+数据库+论文+启动教程
BIM 人才培养的框架和方法 相关的标准
源项目文件
ActiveMQ消息中间件的测试案例
内容概要:本文全面解析了汽车电动化、智能化背景下,车规芯片SoC的重要性和发展趋势。首先概述了汽车行业发展三大趋势——新能源车市场崛起、智能化引领新潮流、商业模式及价值链重构。随后详细介绍了车规芯片SoC的应用领域,包括主控芯片、功率芯片、CMOS芯片、射频接收器、传感器、存储芯片及汽车面板,并阐述了它们的作用和技术需求。文章接着讨论了电子电气架构的演进路径,从分布式向集中式的演进对汽车芯片供应链带来的影响。最后探讨了汽车SoC的技术特征、应用领域、未来发展方向及其面临的挑战。 适合人群:汽车芯片设计师、汽车制造商、科研机构及相关行业的专业人士。 使用场景及目标:理解和掌握汽车芯片尤其是SoC在智能电动汽车中的应用及未来发展,帮助相关从业者做出更好的技术和商业决策。 其他说明:随着智能电动汽车市场的快速成长,车规芯片SoC作为核心技术将面临前所未有的机遇和挑战。
用于控制 Broadlink RM2/3 (Pro) 遥控器、A1 传感器平台和 SP2/3 智能插头的 Python 模块python-broadlink用于本地控制 Broadlink 设备的 Python 模块和 CLI。支持以下设备通用遥控器RM home、RM mini 3、RM plus、RM pro、RM pro+、RM4 mini、RM4 pro、RM4C mini、RM4S、RM4 TV mate智能插头SP mini、SP mini 3、SP mini+、SP1、SP2、SP2-BR、SP2-CL、SP2-IN、SP2-UK、SP3、SP3-EU、SP3S-EU、SP3S-US、SP4L-AU、SP4L-EU、SP4L-UK、SP4M、SP4M-US、Ankuoo NEO、Ankuoo NEO PRO、Efergy Ego、BG AHC/U-01开关MCB1、SC1、SCB1E、SCB2出口BG 800, BG 900电源板MP1-1K3S2U、MP1-1K4S、MP2环境传感器A1报警套件S1C、S2KIT灯泡LB1、LB26 R1、LB2
这是一份关于五个城市的PM2.5监测数据文件,以CSV格式存储。数据涵盖了广州、北京、沈阳等地的空气质量情况,旨在帮助研究人员和数据分析人员更好地理解城市空气污染状况。 使用人群 适合对环境科学、大气污染研究感兴趣的科研工作者、学生及环保组织成员使用。 数据内容 包含五个主要城市的PM2.5浓度数据 时间跨度较长,覆盖多年数据 CSV格式方便导入各种数据分析软件进行进一步处理和分析