拷贝:多用于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. 廖雪峰Java5集合-3Map-Properties的使用

    Properties用于读取配置 properties文件只能使用ASCII码 #表示注释 可以从文件系统读取.properties文件 Properties props = new Properti ...

  2. ntp服务问题

    原本国内的主机直接指向阿里云就可以时间同步了  但是国外的主机 却有报错  这个报错还没有解决 1 Oct 03:47:30 ntpdate[20969]: no server suitable fo ...

  3. Eclipse使用Maven创建Web时错误:Could not resolve archetype org.apache.maven.archetypes:maven-archetype-webap

    网上也有好多方法我没有试成功,不过我将maven的conf setting.xml里的 阿里镜像给注释就可以了,你们也可以试试

  4. vue todolist 封装localstorage

    //封装操作localstorage本地存储的方法 模块化的文件 // nodejs 基础 var storage={ set(key,value){ localStorage.setItem(key ...

  5. andriod InputType.TYPE_NUMBER_FLAG_DECIMAL只能输入数字和小数点无效问题

    在java文件里edittext设置InputType.TYPE_NUMBER_FLAG_DECIMAL, 输入法能输入的是文本输入方式(数字.字母.符号等),和想要只能输入数字和小数点背道而驰. 在 ...

  6. windows 日志解决方法

    1.sql server 2012 报错 MSSQLSERVER 服务无法使用当前配置的密码以 .\MSSQL_SF_A9JGSK 身份登录,错误原因如下: 此帐户的密码已过期. 要确保服务配置正确, ...

  7. 用dlopen,dlsym加载动态链接库.so中函数

    代码如下 static void *findSymbol(const char *path, const char *symbol) { void *handle = dlopen(path, RTL ...

  8. Docker 系列01: Centos7.3 上安装docker

    Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施.容器 ...

  9. C++连接mysql及遇到的相关问题

    最近接触了很多数据库的东西,本来是一直接触的是sql server,不过由于项目需要就开始对mysql进行了连接.下面就让我这个菜鸟浅谈下经验吧. 对于C++连接mysql,我不太喜欢多下载一个软件m ...

  10. android:windowSoftInputMode属性;界面关闭后软键盘不隐藏的解决方法;

    stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置 stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activit ...