克隆的主对象:(重写了clone方法)
public class TestClonBean implements Cloneable,Serializable{
private String name;
private int age;
private String sex;
@Override
protected TestClonBean clone(){
TestClonBean bean = null;
try {
bean = (TestClonBean) super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bean;
}
省略get/set方法……
}
克隆的从属对象:
public class TestCloneChildBean implements Cloneable,Serializable{
private String cname;
private String csex;
private int cage;
省略get/set方法……
}
深度克隆的工具类:
(深度克隆的原理:把对象序列化输出到内存,然后从内存中把序列化的byte[]取出来,进行反序列化获取对象)
public class DeepCloneBean {
public static Object getObject(Object obj){
Object cloneobj = null;
ByteArrayInputStream bin = null;
ByteArrayOutputStream bout = null;
try {
//把对象对到内存中去
bout = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bout);
oos.writeObject(obj);
oos.close();
//把对象从内存中读出来
ByteArrayInputStream bais = new ByteArrayInputStream(bout.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
cloneobj = ois.readObject();
ois.close();
return cloneobj;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
测试:
public class TestClone {
public static void main(String []args){
//浅度克隆
TestCloneChildBean tcc = new TestCloneChildBean();
TestCloneChildBean tcc1 = tcc.clone();
System.out.println(tcc==tcc1);//result:false;
TestClonBean tcb = new TestClonBean();
tcb.setChild(tcc);
TestClonBean tcb1 = tcb.clone();
System.out.println(tcb==tcb1);//result:false;
System.out.println(tcb.getChild()==tcb1.getChild());//result:true;
System.out.println("*****************浅度克隆完************");
//深度克隆
TestClonBean tt1 = new TestClonBean();
TestCloneChildBean tc1 = new TestCloneChildBean();
tt1.setChild(tc1);
TestClonBean tcbclone = (TestClonBean) DeepCloneBean.getObject(tt1);
System.out.println(tt1==tcbclone);//result:false;
System.out.println(tt1.getChild()==tcbclone.getChild());//result:false;
}
}
总结:
不管是深度克隆还是浅度的克隆其实都是产生了一个新的对象。所以我们在比较克隆对象和源对象的时候返回是false。而深度克隆和浅度的克隆的区别在于:浅度克隆的对象只会克隆普通属性,不会克隆对象属性。而深度克隆就会连对象属性一起克隆。所以我们在对比深度克隆中的tt1.getChild()==tcbclone.getChild()时,返回是false。而浅度克隆时返回true。
分享到:
相关推荐
Java提供了两种主要的克隆方式:浅度克隆(Shallow Clone)和深度克隆(Deep Clone)。理解这两种克隆的区别对于优化内存管理和复制复杂对象至关重要。 **浅度克隆(Shallow Clone)** 浅度克隆仅仅复制了对象本身...
***中深度复制和浅度复制是编程中常见的概念,尤其是在涉及到对象复制和内存管理的场景中。为了理解这两个概念,首先我们需要明确值类型和引用类型的区别。 值类型直接存储其数据,而在.NET框架中包括了所有的基本...
在进行对象克隆的过程中,根据复制的深度,可以分为浅度克隆和深度克隆。 浅度克隆(Shallow Clone)仅适用于对象的第一层属性,如果属性值为基本类型,则复制其值;如果属性值为引用类型,则复制其引用地址。这...
在“prototypeAndCreate.zip”压缩包中,我们可能找到与原型模式相关的代码示例,包括浅度克隆和深度克隆两种不同的复制策略。浅度克隆仅仅复制对象本身,而不复制其引用的对象,而深度克隆则会递归地复制对象及其...
**1.4 深度克隆与浅度克隆** - **浅度克隆**:仅复制对象的基本类型属性值,对于对象引用类型属性,只复制引用本身而非引用指向的对象。 - **深度克隆**:不仅复制对象本身,还递归复制对象内的所有引用对象。 **...
- **浅度克隆**:只复制对象本身,对于对象中的对象仅复制其引用。 #### Collection与Collections的区别 - **Collection**:Java集合框架的一部分,定义了集合的行为。 - **Collections**:提供了用于操作或返回...
2. **实用函数**:包括`_.uniqueId`用于生成唯一ID,`_.clone`用于深度或浅度克隆对象,`_.isEqual`用于比较两个值是否相等,以及`_.throttle`和`_.debounce`用于节流和防抖,优化性能。 3. **对象操作**:...