- 浅复制
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。
看下面的例子
School类
public class School implements Cloneable{ private String name; public School(String name){ this.name = name; } @Override public String toString() { return name; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Student类
public class Student implements Cloneable{ private int age; private School school; public Student(){ System.out.println("init..."); } @Override protected Object clone() throws CloneNotSupportedException { Student cloneStudent = (Student)super.clone(); return cloneStudent; } @Override public String toString() { return "age:"+age+" school:"+school; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public School getSchool() { return school; } public void setSchool(School school) { this.school = school; } }
测试代码
Student s1 = new Student(); s1.setAge(20); s1.setSchool(new School("java school")); System.out.println("before clone s1 value is "+s1); Student s2 = (Student)s1.clone(); s2.setAge(18); s2.getSchool().setName("c++ school"); System.out.println("after clone s1 value is "+s1); System.out.println("after clone s2 value is "+s2);
运行结果
init... before clone s1 value is age:20 school:java school after clone s1 value is age:20 school:c++ school after clone s2 value is age:18 school:c++ school
由s1对象克隆来的s2对象,两个对象的成员变量school有相同的引用。
- 深复制
被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。深复制把要复制的对象所引用的对象都复制了一遍。
将Student类的clone方法改为
@Override protected Object clone() throws CloneNotSupportedException { Student cloneStudent = (Student)super.clone(); cloneStudent.setSchool((School)this.school.clone()); return cloneStudent; }
运行结果
init... before clone s1 value is age:20 school:java school after clone s1 value is age:20 school:java school after clone s2 value is age:18 school:c++ school
- 使用串行化实现深复制
Student和School实现Serializable接口
Student添加方法
public Object deepClone() throws IOException, ClassNotFoundException { // 将对象写到流里 ByteArrayOutputStream bo = new ByteArrayOutputStream(); ObjectOutputStream oo = new ObjectOutputStream(bo); oo.writeObject(this); // 从流里读出来 ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); ObjectInputStream oi = new ObjectInputStream(bi); return (oi.readObject()); }
测试代码
Student s1 = new Student(); s1.setAge(20); s1.setSchool(new School("java school")); System.out.println("before clone s1 value is "+s1); Student s2 = (Student)s1.deepClone(); s2.setAge(18); s2.getSchool().setName("c++ school"); System.out.println("after clone s1 value is "+s1); System.out.println("after clone s2 value is "+s2);
运行结果
init... before clone s1 value is age:20 school:java school after clone s1 value is age:20 school:java school after clone s2 value is age:18 school:c++ school
相关推荐
android 浅复制和深复制-Java Generic Deep Copy 篇
主要介绍了Java 浅复制和深复制的实例详解的相关资料,这里提供实例帮助大家学习理解这部分内容,需要的朋友可以参考下
java的深复制与浅复制,讲述了深复制和浅复制的区别
Java关于深拷贝(深复制)和浅拷贝(浅复制)比较通俗易懂的简单说明及示例代码...
java深复制浅复制的实现附源代码,并实现java类之间的多对多联系。
Java深复制与浅复制
1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
主要介绍了Java中的深拷贝(深复制)和浅拷贝(浅复制)介绍,需要的朋友可以参考下
Java中对象的深复制和浅复制详解.doc
主要帮助大家理解java中的深复制和浅复制,对java中的深复制和浅复制进行剖析,感兴趣的小伙伴们可以参考一下
Java对象的复制与克隆,包含浅复制和深层复制。 免费下载啦,绝对值得一看。
首先我们看看浅拷贝和深拷贝的定义 浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制 深拷贝:对象,对象内部的引用均复制 为了更好的理解它们的区别我们假设有一个对象A,它包含...
主要介绍了Java中对象的深复制(深克隆)和浅复制(浅克隆) ,需要的朋友可以参考下
NULL 博文链接:https://zzqrj.iteye.com/blog/572562
浅拷贝(浅复制、浅克隆)、深拷贝(深复制、深克隆)实战工程,IDEA搭建
java 深克隆浅克隆···············
今天小编就为大家分享一篇关于Java Clone深拷贝与浅拷贝的两种实现方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
浅复制与深复制只存在于引用数据类型当中 基本数据类型储存在栈内存当中 栈内存是一个萝卜一个坑 互不影响 引用数据类型储存在堆内存当中 堆内存是一片储存空间,引用数据类型存储在堆内存中的是一个内存地址 ,...
主要介绍了 Java对象深复制与浅复制实例详解的相关资料,需要的朋友可以参考下
java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】 * 原型模式(Prototype) * 实现方式: * 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 ...