浅拷贝和深拷贝(java)
拷贝:多用于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)的更多相关文章
- Java的浅拷贝与深拷贝
Java的浅拷贝与深拷贝 Java中,所有的类都继承Object,Object中有clone方法,它被声明为了 protected ,所以我们但是如果要使用该方法就得重写且声明为public,必须在要 ...
- 【转】JAVA中的浅拷贝和深拷贝
原文网址:http://blog.bd17kaka.net/blog/2013/06/25/java-deep-copy/ JAVA中的浅拷贝和深拷贝(shallow copy and deep co ...
- 浅析java的浅拷贝和深拷贝
Java中任何实现了Cloneable接口的类都可以通过调用clone()方法来复制一份自身然后传给调用者.一般而言,clone()方法满足: (1) 对任何的对象x,都有x.clone( ...
- Java 浅拷贝和深拷贝的理解和实现方式
Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去.举例说明:比如,对象A和对象B都属于类S,具有属性a和b.那么对对象A进行拷贝 ...
- java 浅拷贝和深拷贝 对象克隆clone
分一下几点讨论: 为什么要克隆? 如何实现克隆 浅克隆和深克隆 解决多层克隆问题 总结 一:为什么要克隆? 大家先思考一个问题,为什么需要克隆对象?直接new一个对象不行吗? 答案是:克隆的对象可能包 ...
- Java对象的浅拷贝和深拷贝&&String类型的赋值
Java中的数据类型分为基本数据类型和引用数据类型.对于这两种数据类型,在进行赋值操作.方法传参或返回值时,会有值传递和引用(地址)传递的差别. 浅拷贝(Shallow Copy): ①对于数据类型是 ...
- 浅拷贝和深拷贝(谈谈java中的clone)
clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言中,有 ...
- Java中的clone方法-理解浅拷贝和深拷贝
最近学到Java虚拟机的相关知识,更加能理解clone方法的机制了 java中的我们常常需要复制的类型有三种: 1:8种基本类型,如int,long,float等: 2:复合数据类型(数组): 3:对 ...
- java List复制:浅拷贝与深拷贝
Java的拷贝可以分为三种:浅拷贝(Shallow Copy).深拷贝(Deep Copy).延迟拷贝(Lazy Copy). 在java中除了基本数据类型之外(int,long,short等),还存 ...
随机推荐
- 学习笔记之Bokeh Data Visualization | DataCamp
Bokeh Data Visualization | DataCamp https://www.datacamp.com/courses/interactive-data-visualization- ...
- Maven的classifier作用
classifier可以是任意的字符串,用于拼接在GAV之后来确定指定的文件. 可用于区分不同jdk版本所生成的jar包 <dependency> <groupId>net.s ...
- go语言学习--map中键值得删除
测试 map1 中是否存在 key1: 在例子 8.1 中,我们已经见过可以使用 val1 = map1[key1] 的方法获取 key1 对应的值 val1.如果 map 中不存在 key1,val ...
- [UE4]角度和弧度
1角度 = 一个圆周的1/360 1弧度 = 长度为半径的弧,其所对的圆心角
- quicktime player录屏没有声音的解决方法
作者:殊哥链接:https://www.zhihu.com/question/20251726/answer/94938941来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...
- 0009 - WebFlux
1.概述 大多数场景使用MVC都是阻塞式的,WebFlux使用的场景是异步非阻塞的 响应式编程是基于异步和事件驱动的非阻塞程序,只是垂直通过在JVM内启动少量线程扩展,而不是水平通过集群扩展. Spr ...
- adb显示 部分乱码修改方法
用windows自带的命令行[cmd]软件链接adb 设备后,部分显示乱码,如下图片所示: 图1 修改方法如下: alias ls='busybox ls --color=never' 修改后显示正常 ...
- Fragment onActivityResult提前响应,startActivityForResult执行后立即响应onActivityResult的解决方法
找不到病根真是让人愁白了头: 今天写了一个startActivityForResult,开启一个Activity并拿到返回的结果,但是startActivityForResult刚走,onActivi ...
- Fragment与Radiogroup联动,经典的主界面布局。使用show和hide的方式实现;
Fragment+RadioGroup经典的主界面布局,方便实用: 1.使用replace方式: 直接上代码,先是布局文件: <?xml version="1.0" enco ...
- ActiveMQ核心技术
消息中间件技术 一.ActiveMQ 1>生产消息,消费消息流程图