浅拷贝和深拷贝(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等),还存 ...
随机推荐
- C++之二阶构造模式
前言:C++中经常会因为调用系统资源失败导致出现BUG,所以在类调用构造函数需要分配系统资源时会出现BUG,从而导致类对象虽然被创建,但是只是个半成品,为了避免这种情况需要使用二阶构造模式 二阶构造模 ...
- Java NIO系列教程(五)Buffer
Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的.交互图如下: 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被 ...
- JSON 简介
ylbtech-JSON: JSON 简介 JSON:JavaScript Object Notation(JavaScript 对象表示法) JSON是存储和交换文本信息的语法,类似 XML. JS ...
- 保持url唯一性 解决多个网站首页问题
原文地址:http://www.seowhy.com/bbs/thread-2694339-1-1.html 在网站SEO优化过程中,经常会遇到这样或者那样的常见技术型问题,达闻现将此类常见技术问题总 ...
- [UE4]更新UI的三种方式
一.函数绑定 二.属性绑定 只会列出匹配的数据类型. 三.事件驱动更新 啦啦啦啦啦 结论:函数和属性绑定的原理都是每帧都去调用绑定的函数/属性,效率比较低下,一般不推荐使用.事件驱动更新的效率最好,性 ...
- Mybatis 系列9-强大的动态sql 语句
[Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...
- (转)Linux tcpdump命令详解
简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的 ...
- sp_settriggerorder 设置触发器执行顺序
sp_settriggerorder (Transact-SQL) 本主题适用于:SQL Server(从 2008 开始)Azure SQL 数据库Azure SQL 数据仓库并行数据仓库 ...
- TCP/IP SIGPIPE信号
往一个已经接受FIN的套接中写是允许的,接受到FIN仅仅代表对方不再发送数据. 在收到RST段之后,如果在调用write就 会产生SIGPIPE信息,对于这个信号的处理我们通常 解决方法 signal ...
- 洛谷 P2629 好消息,坏消息
题目描述 uim在公司里面当秘书,现在有n条消息要告知老板.每条消息有一个好坏度,这会影响老板的心情.告知完一条消息后,老板的心情等于之前老板的心情加上这条消息的好坏度.最开始老板的心情是0,一旦老板 ...