拷贝:多用于prototype原型模式的复制。

数据库连接池,将properties中的jdbc信息(user/password/url/port)等获取后赋值给jdbcData对象,然后将对象复制n份,连接数据库,创建连接池。

浅拷贝:

复制对象指向,不复制值,除过基本类型.当有对象在里面时,修改原对象的值,会导致clone后的内容值也发生变化。因为指向不变。

如果一个对象中没有引用其它对象,String不算。可以使用浅拷贝。因为String每次会新创建而不会破坏克隆后对象的引用。
***   浅拷贝clone要implements Cloneable接口

深拷贝

对象指向及其值一起拷贝,(如果一个对象中引用了另一个对象,而另一个对象中没有再引用其它内容,可在拷贝时,将内部对象重新拷贝再赋给当前对象)。

要通过输出流输入流的形式对象需要序列化操作。

**** 深拷贝clone要implements Serializable接口,其内部对象也要串型化

以下为创建的示例:

 /**
* 原型模式要实现克隆,必须实现Cloneable
* 拷贝分深拷贝和
* 浅拷贝:复制对象指向,不复制值,除过基本类型.当有对象在里面时,修改原对象的值,会导致clone后的内容值也发生变化。因为指向不变。
* 如果一个对象中没有引用其它对象,String不算。可以使用浅拷贝。因为String每次会新创建而不会破坏克隆后对象的引用。
* 浅拷贝clone要implements Cloneable接口
* 深拷贝:对象指向及其值一起拷贝,(如果一个对象中引用了另一个对象,而另一个对象中没有再引用其它内容,可在拷贝时,将内部对象重新拷贝再赋给当前对象)。要通过输出流输入流的形式
* 对象需要序列化操作。
* 深拷贝clone要implements Serializable接口,其内部对象也要序列号
*
* @author DennyZhao
* @date 2017年6月13日
* @version 1.0
*/
public class PrototypeFactory implements Cloneable, Serializable{ /**
* 自动生成序列号
*/
private static final long serialVersionUID = 1416969741781583897L;
private String name;
private String englishName;
private String nickName;
private int age;
private AnimalFactory animal; public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getEnglishName() {
return englishName;
}
public void setEnglishName(String englishName) {
this.englishName = englishName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public AnimalFactory getAnimal() {
return animal;
}
public void setAnimal(AnimalFactory animal) {
this.animal = animal;
}
@Override
public String toString() {
return "PrototypeFactory [name=" + name + ", englishName="
+ englishName + ", nickName=" + nickName + ", age=" + age
+ ", animal=" + animal + "]";
} /**
* 浅拷贝
*/
public PrototypeFactory clone() throws CloneNotSupportedException{
return (PrototypeFactory)super.clone();
} /**
* 这种拷贝只能针对对象内的对象内都是基本数据类型才可以。且内部对象也具有克隆方法
*/
public PrototypeFactory clone2() throws CloneNotSupportedException{
PrototypeFactory pro = (PrototypeFactory)super.clone();
//pro.animal = (PrototypeFactory)pro.animal.clone;
return pro;
} /**
* 深拷贝
*/
public PrototypeFactory deepClone(){
ByteArrayOutputStream os = new ByteArrayOutputStream();
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
PrototypeFactory pro = null;
try {
oos = new ObjectOutputStream(os);
oos.writeObject(this);
ois = new ObjectInputStream(new ByteArrayInputStream(os.toByteArray()));
pro = (PrototypeFactory)ois.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return pro;
} }

ProtoTypeFactory

测试示例:

 public class TestProtoType {

     public static void main(String[] args) throws CloneNotSupportedException {
//原型模式
PrototypeFactory protoFactory = new PrototypeFactory();
protoFactory.setEnglishName("DennyZhao");
protoFactory.setName("~~~~强~~");
protoFactory.setNickName("~~王~~");
protoFactory.setAge(10);
Rabit rabit22 = new Rabit();
rabit22.getHeader("A", 2, "B");
protoFactory.setAnimal(rabit22);
PrototypeFactory cloneProto = protoFactory.clone();
PrototypeFactory cloneDeep = protoFactory.deepClone();
System.out.println("protoFactory:--" + protoFactory.toString());
System.out.println("cloneProto:---" + cloneProto.toString());
System.out.println("cloneDeep:---" + cloneDeep.toString());
// 修改原数据参数
protoFactory.setEnglishName("Denny....");
protoFactory.setAge(8);
((Rabit)protoFactory.getAnimal()).getHeader("C", 3, "D");
System.out.println("2protoFactory:--" + protoFactory.toString());
System.out.println("2cloneProto:---" + cloneProto.toString());
System.out.println("2cloneDeep:---" + cloneDeep.toString());
System.out.println("3protoFactory---" + ((Rabit)protoFactory.getAnimal()).getHeader());
System.out.println("3cloneProto---" + ((Rabit)cloneProto.getAnimal()).getHeader());
System.out.println("3cloneDeep---" + ((Rabit)cloneDeep.getAnimal()).getHeader()); }

TestPrototype

运行结果:

 protoFactory:--PrototypeFactory [name=~~~~强~~, englishName=DennyZhao, nickName=~~王~~, age=10, animal=pattern.creation.factory.animal.Rabit@a57993]
cloneProto:---PrototypeFactory [name=~~~~强~~, englishName=DennyZhao, nickName=~~王~~, age=10, animal=pattern.creation.factory.animal.Rabit@a57993]
cloneDeep:---PrototypeFactory [name=~~~~强~~, englishName=DennyZhao, nickName=~~王~~, age=10, animal=pattern.creation.factory.animal.Rabit@17327b6]
2protoFactory:--PrototypeFactory [name=~~~~强~~, englishName=Denny...., nickName=~~王~~, age=8, animal=pattern.creation.factory.animal.Rabit@a57993]
2cloneProto:---PrototypeFactory [name=~~~~强~~, englishName=DennyZhao, nickName=~~王~~, age=10, animal=pattern.creation.factory.animal.Rabit@a57993]
2cloneDeep:---PrototypeFactory [name=~~~~强~~, englishName=DennyZhao, nickName=~~王~~, age=10, animal=pattern.creation.factory.animal.Rabit@17327b6]
3protoFactory---C3D
3cloneProto---C3D
3cloneDeep---A2B

Result

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

内容借鉴:(Java中的深拷贝(深复制)和浅拷贝(浅复制)http://www.cnblogs.com/shuaiwhu/archive/2010/12/14/2065088.html

以上,为个人总结,如有写的不当之处,还望指正。

-----------DennyZhao

浅拷贝和深拷贝(java)的更多相关文章

  1. Java的浅拷贝与深拷贝

    Java的浅拷贝与深拷贝 Java中,所有的类都继承Object,Object中有clone方法,它被声明为了 protected ,所以我们但是如果要使用该方法就得重写且声明为public,必须在要 ...

  2. 【转】JAVA中的浅拷贝和深拷贝

    原文网址:http://blog.bd17kaka.net/blog/2013/06/25/java-deep-copy/ JAVA中的浅拷贝和深拷贝(shallow copy and deep co ...

  3. 浅析java的浅拷贝和深拷贝

    Java中任何实现了Cloneable接口的类都可以通过调用clone()方法来复制一份自身然后传给调用者.一般而言,clone()方法满足:       (1) 对任何的对象x,都有x.clone( ...

  4. Java 浅拷贝和深拷贝的理解和实现方式

    Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去.举例说明:比如,对象A和对象B都属于类S,具有属性a和b.那么对对象A进行拷贝 ...

  5. java 浅拷贝和深拷贝 对象克隆clone

    分一下几点讨论: 为什么要克隆? 如何实现克隆 浅克隆和深克隆 解决多层克隆问题 总结 一:为什么要克隆? 大家先思考一个问题,为什么需要克隆对象?直接new一个对象不行吗? 答案是:克隆的对象可能包 ...

  6. Java对象的浅拷贝和深拷贝&&String类型的赋值

    Java中的数据类型分为基本数据类型和引用数据类型.对于这两种数据类型,在进行赋值操作.方法传参或返回值时,会有值传递和引用(地址)传递的差别. 浅拷贝(Shallow Copy): ①对于数据类型是 ...

  7. 浅拷贝和深拷贝(谈谈java中的clone)

    clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言中,有 ...

  8. Java中的clone方法-理解浅拷贝和深拷贝

    最近学到Java虚拟机的相关知识,更加能理解clone方法的机制了 java中的我们常常需要复制的类型有三种: 1:8种基本类型,如int,long,float等: 2:复合数据类型(数组): 3:对 ...

  9. java List复制:浅拷贝与深拷贝

    Java的拷贝可以分为三种:浅拷贝(Shallow Copy).深拷贝(Deep Copy).延迟拷贝(Lazy Copy). 在java中除了基本数据类型之外(int,long,short等),还存 ...

随机推荐

  1. js中事件三阶段

    js中事件三阶段 先贴代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  2. 学习笔记之Data Visualization

    Data visualization - Wikipedia https://en.wikipedia.org/wiki/Data_visualization Data visualization o ...

  3. Ajax的课外了解

    Ajax传入的数据的话,只能是字符串或数字,字段,其他形式的传参都不可以: Ajax只是跟后台交互也有同源策略的限制: 不是当前服务器叫跨域: Ajax也有同源策略的限制想做跨域处理,只能通过scri ...

  4. 俞敏洪:我创业24年感悟的3条CEO守则

    转自:http://www.gamelook.com.cn/2017/10/306603 创业24年,他的创业经历被拍成了电影.在一次小范围聚会时,他说现实远比剧本要精彩.“如果让我一切从头开始,我会 ...

  5. jQuery动态创建DOM节点

    var SKU=$("#SKU"); // 通过ID查找到指定表格 var oTable=SKU[0]; // 获取第一个表格 // 获取正文tbody元素 var tBodies ...

  6. Install Greenplum OSS on Ubuntu

    About Greenplum Database Greenplum Database is an MPP SQL Database based on PostgreSQL.  Its used in ...

  7. Delphi StringGrid控件的用法

    Delphi StringGrid控件 组件名称:StringGrid         ●固定行及固定列:  StringGrid.FixedCols:=固定行之数;  StringGrid.Fixe ...

  8. (转)程序员级别鉴定书(.NET面试问答集锦)

    原文地址:http://www.cnblogs.com/powertoolsteam/p/what-net-developer-should-to-know.html 葡萄城控件 作为一个.NET程序 ...

  9. OpenGL中移动单位中的‘单位’指什么

    opengl 比如 用到glm::translate(x,y,z) 表示 移动x,y,z个单位, 那么这个这个单位是指什么呢?这里的单位不是指像素,是根据投影矩阵的变化而变化的,默认情况下投影矩阵Pr ...

  10. python—正则表达式

    我们平时上网的时候,经常需要在一些网站上注册帐号,而注册帐号的时候对帐号信息会有一些要求. 比如: 上面的图片中,输入的邮件地址.密码.手机号 符合要求才可以注册成功. 我们是我们自己写的网站,那么我 ...