ClassA a = new ClassA(); ClassA b = a;
上述两条语句,b对象直接引用了a对象,如果ClassA里面有其他属性,则a和b由于是同一个对象,所以属性的值也是一样的。假如现在我们需要一个和a一样的对象,即复制,这时候比较无脑的做法是new一个ClassA,然后把a对象里面的属性全部无脑拷贝到新建的对象c里面。
但是上述的方法真的有效吗?
不是的。如果a对象里面的属性全是基础类型int,byte,string等,那到时能实现这样的复制目的。但是如果a对象里面的属性也是对象,那么修改c对象的属性,则a对象的对应属性也是会被修改的。
ClassA a = new ClassA(); ClassA c = new ClassA(); c.cla=a.cla; //此时修改a.cla,那么c.cla也会被修改 class ClassA{ public ClassB cla; }
java克隆方法:深度克隆与浅层克隆
浅层克隆,不需要向上述方法那样重新new一个新对象,再把对象的属性无脑照搬。
实现方法:
1、克隆对象的类实现cloneable接口
2、重写clone方法
public class A implements Cloneable{ public B b ; //重写clone方法 public Object clone(){ Object o = null; try { o= super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return o; } }
clone方法是object类的native方法,该native方法具体是做什么并没细查,只知道该native方法实现的功能与刚才上面的实现无脑克隆方法是一样的,new一个新对象,并把属性复制过去。该方法也是没能解决问题,但是代码量也就少了很多。接下来介绍深度克隆方法。
深度克隆有两种实现方式,一种是用流的形式,另外一种是根据浅克隆,对其属性也进行克隆来达到深度克隆的效果。
1、流的形式:要复制的类要实现序列化,包括类的属性。
public class A implements Serializable{ public B b ; public A getCopy(){ ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); A o =(A) ois.readObject(); return o; } } A a = new A(); A c = a.getCopy(); //此时a对象与c对象是不同对象,包含的属性虽然值相同,但是也是不同对象。
2、clone方式
public Class B implements Cloneable{ public Object clone(){ //try catch return super.clone(); } } //同时在A的clone方法添加上属性的clone /** *A类里 */ public Object clone(){ A o =null; o=(A)super.clone; o.b=b.clone(); } //有多少属性不是基础类型的都要这样子搞,也能达到深度克隆的效果
对比深度克隆的两种实现方法的效果,两种方法都不是很方便,流的方法每个属性都要实现序列化。而clone方法不止需要实现cloneable接口,还得再clone方法里即对本身克隆,又要对属性进行克隆,十分不便。而时效性方面,clone方法要比实现流的方法快速的多,所以总结,一般不要进行深度克隆。
相关推荐
学习java深克隆与浅克隆,希望对你有用
java 深克隆 浅克隆
java 深克隆浅克隆···············
Java对象的深克隆与浅克隆详解.zip
NULL 博文链接:https://gegeyi.iteye.com/blog/1562016
主要介绍了java 对象的克隆的相关资料,这里对浅克隆和深克隆进行了实例分析需要的朋友可以参考下
有关Java中的克隆技术的详细讲述,其中讲解了“浅复制”和“深复制”的用法和区别,继承了Java中的封装类Cloneable
在本篇文章中我们给大家分享了关于java对象中浅克隆和深克隆的相关知识点和相关代码内容,有兴趣的朋友们学习下。
java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】 * 原型模式(Prototype) * 实现方式: * 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 ...
Java对象的复制与克隆,包含浅复制和深层复制。 免费下载啦,绝对值得一看。
浅拷贝(浅复制、浅克隆)、深拷贝(深复制、深克隆)实战工程,IDEA搭建
本篇文章是对JAVA深度克隆与浅度克隆的区别进行了详细的分析介绍,需要的朋友参考下
浅克隆: package testclone; public class ShallowClone implements Cloneable { public String name; public String[] name2; public ShallowClone() { name2 = new String[2]; } public Object clone() {...
示例Bean.java 公共类ExampleBean { 私有 int id; 私人用户用户; 私人名单名单; 公共 int getId() { 返回ID; } 公共无效setId(int id){ 这个.id = id; } 公共用户 getUser() { 返回用户; } ...
主要介绍了Java中对象的深复制(深克隆)和浅复制(浅克隆) ,需要的朋友可以参考下
android 浅复制和深复制-Java Generic Deep Copy 篇
Java克隆(Clone)是Java语言的特性之一,本篇文章主要介绍了Java中的Clone机制是如何工作的,需要的朋友可以参考下
概述对象克隆库。 支持可扩展的浅层和深层对象克隆策略。用法下面是一个关于如何使用库的示例 // Example TestObject clone = new ObjectCloner().deepClone(originalTestObject);有关更多示例,请参阅 junit 测试...
1.浅复制与深复制概念 ...⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
主要介绍了Java实现克隆的三种方式,结合实例形式总结分析了java浅复制、深复制以及使用serializable实现深复制的相关操作技巧,需要的朋友可以参考下