CloneUtil类:
package com.bijian.study.clone; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; public class CloneUtil { public static void main(String[] args) { //创建一个对象 TemplateObject templateObject = new TemplateObject(); templateObject.setAge(10); templateObject.setName("test"); ArrayList<String> descriptions = new ArrayList<String>(); descriptions.add("是一个好人"); descriptions.add(new String("好姑娘")); descriptions.add(new String("硕士毕业")); descriptions.add(new String("白富美")); templateObject.setDescriptionList(descriptions); Style style = new Style(); style.setLength(1600); style.setType("欧美风"); Clothing clothing = new Clothing(); clothing.setColor("红色"); clothing.setSize(160); clothing.setStyle(style); templateObject.setClothing(clothing); System.out.println(templateObject); TemplateObject cloneTemplateObject = (TemplateObject) CloneUtil.getCloneObject(templateObject); System.out.println(cloneTemplateObject); System.out.println("templateObject==templateObject:" + (templateObject == cloneTemplateObject)); System.out.println("templateObject.equals(templateObject):" + (templateObject.equals(cloneTemplateObject))); System.out.println("templateObject.toString().equals(templateObject.toString()):" + (templateObject.toString().equals(cloneTemplateObject.toString()))); } // 克隆对象 public static Object getCloneObject(Object bean) { Object cloneBean = null; try { ByteArrayOutputStream byout = new ByteArrayOutputStream(); ObjectOutputStream obj = new ObjectOutputStream(byout); obj.writeObject(bean); ByteArrayInputStream byin = new ByteArrayInputStream(byout.toByteArray()); ObjectInputStream ins = new ObjectInputStream(byin); cloneBean = (Object) ins.readObject(); } catch (Exception ex) { System.err.print(ex); } return cloneBean; } }
TemplateObject类:
package com.bijian.study.clone; import java.io.Serializable; import java.util.ArrayList; public class TemplateObject implements Serializable { /** * */ private static final long serialVersionUID = 6790908190923407706L; private int age; private String name; private ArrayList<String> descriptionList; private Clothing clothing; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public ArrayList getDescriptionList() { return descriptionList; } public void setDescriptionList(ArrayList descriptionList) { this.descriptionList = descriptionList; } public Clothing getClothing() { return clothing; } public void setClothing(Clothing clothing) { this.clothing = clothing; } public String toString() { String baseInfo = String.valueOf(age) + name; String descriptions = ""; for(int i=0;i<descriptionList.size();i++) { descriptions += descriptionList.get(i).toString(); } return baseInfo + descriptions + clothing; } }
Clothing类:
package com.bijian.study.clone; import java.io.Serializable; public class Clothing implements Serializable { /** * */ private static final long serialVersionUID = -2876485615924815655L; private String color; private int size; private Style style; public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public Style getStyle() { return style; } public void setStyle(Style style) { this.style = style; } public String toString() { return color + String.valueOf(size) + style; } }
Style类:
package com.bijian.study.clone; import java.io.Serializable; public class Style implements Serializable { /** * */ private static final long serialVersionUID = -7052770518598516803L; private String type; private int length; public String getType() { return type; } public void setType(String type) { this.type = type; } public int getLength() { return length; } public void setLength(int length) { this.length = length; } public String toString() { return type + String.valueOf(length); } }
运行结果:
10test是一个好人好姑娘硕士毕业白富美红色160欧美风1600 10test是一个好人好姑娘硕士毕业白富美红色160欧美风1600 templateObject==templateObject:false templateObject.equals(templateObject):false templateObject.toString().equals(templateObject.toString()):true
相关推荐
三、深克隆实现 实现深克隆通常需要递归地遍历对象的所有属性,包括嵌套的对象和集合。对于复杂的对象结构,可以使用序列化和反序列化技术来实现深克隆。首先,将对象序列化为字节数组,然后反序列化为新的对象。...
克隆主要用于创建对象的备份、实现复制功能或者在多线程环境中避免共享状态。Java提供了两种主要的克隆方式:浅克隆(Shallow Clone)和深克隆(Deep Clone)。下面我们将深入探讨这两种克隆方法。 ### 浅克隆 浅...
在实际编程中,除了`clone()`方法,还可以考虑使用`Serializable`接口结合`ObjectInputStream`和`ObjectOutputStream`实现序列化和反序列化来创建对象的深拷贝。这种方法虽然相对复杂,但对于复杂对象结构的完全复制...
实验的目的是让开发者熟悉Java的流概念,掌握字符和对象输入/输出流的使用,以及如何通过序列化和反序列化实现对象的持久化。通过这个实验,可以学习到如何利用Java I/O流处理文件,以及如何利用序列化进行对象的...
标签中的“复制java对象”、“深度克隆”和“深度复制实例”强调了我们要关注的是Java中如何实现对象的深拷贝,并提供了实际操作的例子。在编写代码时,应该遵循良好的编程实践,包括适当的命名、注释和错误处理,以...
在Java中,深克隆通常通过序列化和反序列化来实现,或者手动创建一个新的对象并复制所有字段。下面是一个使用序列化实现深克隆的例子: ```java import java.io.*; // 在Student类中添加序列化和反序列化方法 ...
- **算法中**:在一些算法实现中,如搜索或排序,克隆可以帮助我们处理临时对象,而不影响原始数据。 ### 4. 注意事项 - 实现`Cloneable`接口时,Java官方建议覆盖`clone()`方法并抛出`CloneNotSupportedException...
1. **实现Serializable接口**:让需要克隆的对象实现`Serializable`接口,这样可以将对象转换为字节数组,然后再恢复为新的对象。 ```java public class MyClass implements Serializable { // ... } ``` 2. **序列...
2. **手工编写方式**:对于复杂对象或者包含大量循环引用的对象,可以通过重写对象中的`clone()`方法并手动处理其中的引用类型成员变量来实现深度克隆。这种方式更加灵活,但编写起来相对复杂且容易出错。 #### 三...
在JavaScript中,我们可以使用JSON对象的`parse()`和`stringify()`方法来实现深度克隆: ```javascript function deepClone(obj) { return JSON.parse(JSON.stringify(obj)); } ``` 这种方法简单易用,但不适用于...
在Java编程语言中,克隆和序列化是两个重要的概念,它们在数据处理和对象管理中扮演着关键角色。下面将分别对这两个概念进行详细解释,并结合实例和源代码进行阐述。 **一、克隆** 1. **克隆定义**:克隆是指创建...
4. **对象序列化**:通过`ObjectInputStream`和`ObjectOutputStream`,Java支持对象的序列化和反序列化,允许将对象转换为字节流并存储或在网络上传输。 **对象克隆** Java中的对象克隆是指创建一个现有对象的副本...
有多种方式可以实现对象克隆,其中一种就是通过Java的序列化机制。序列化是将对象的状态转换为字节流的过程,而反序列化则是将字节流恢复为对象状态的过程。这种机制可以用来实现深度克隆,即不仅克隆对象本身,还...
如何实现对象克隆? 有两种方式可以实现对象克隆: 1. 实现Cloneable接口并重写Object类中的clone()方法。 2. 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。 下面是一个...
该机制通过使用ObjectOutputStream和ObjectInputStream两个类来实现对象的序列化和反序列化。 在Java对象流实例代码中,主要使用了ObjectOutputStream和ObjectInputStream两个类。ObjectOutputStream用于将对象写入...
`copy()`方法使用`ObjectOutputStream`将当前对象写入字节数组,然后通过`ObjectInputStream`读取这个字节数组并反序列化为新对象。 值得注意的是,深度克隆可能会带来一些潜在的问题。序列化和反序列化过程可能会...
实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。在 Object 基类中,有一个方法叫 clone,产生一个前期对象的克隆,克隆对象是原对象的拷贝,由于引用类型的存在,有深克隆和...
以下是一个简单的深克隆实现示例: ```java import java.io.*; // 原型接口 public interface Prototype { Prototype clone() throws CloneNotSupportedException; } // 具体原型类,实现深克隆 public class ...