[2014-11-21]Java笔记_对象的深克隆与浅克隆、clone()
2014-11-21 14:34
423 查看
一、深拷贝(deep clone)与浅拷贝(shallow clone)
浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。(不复制它所引用的对象)。
深复制:被复制对象的所有变量都含有与原来的对象相同的值,出去耐心哦引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。(把要复制的对象所引用的对象都复制了一遍)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201411/1eeee6aba0bd48cb76d7429dabcf6ed6)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201411/7a7f309cb9e4981aea1f1b2faaa26fda)
· 利用序列化来做深复制
序列化会将对象的所有信息都写入到流中,包或对象中的所有引用信息。可以利用序列化的特点来实现深复制。
package com.bob.clone;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class CloneTest3 {
public static void main(String[] args) throws Exception {
Teacher3 t = new Teacher3();
t.setAge(40);
t.setName("Teacher Zhang");
Student3 s1 = new Student3();
s1.setAge(20);
s1.setName("zhangsan");
s1.setTeacher(t);
Student3 s2 = (Student3) s1.deepCopy();
System.out.println(s2.getAge());
System.out.println(s2.getName());
System.out.println("-----------------------");
System.out.println(s2.getTeacher().getAge());
System.out.println(s2.getTeacher().getName());
s2.getTeacher().setAge(50);
s2.getTeacher().setName("Teacher Li");
System.out.println(s1.getTeacher().getAge());
System.out.println(s1.getTeacher().getName());
}
}
class Teacher3 implements Serializable {
private int age;
private String name;
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;
}
}
class Student3 implements Serializable {
private int age;
private String name;
private Teacher3 teacher;
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 Teacher3 getTeacher() {
return teacher;
}
public void setTeacher(Teacher3 teacher) {
this.teacher = teacher;
}
public Object deepCopy() throws Exception {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
}
浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。(不复制它所引用的对象)。
深复制:被复制对象的所有变量都含有与原来的对象相同的值,出去耐心哦引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。(把要复制的对象所引用的对象都复制了一遍)
package com.bob.clone; public class CloneTest2 { public static void main(String[] args) throws Exception { Teacher teacher = new Teacher(); teacher.setAge(40); teacher.setName("Teacher zhang"); Student2 s1 = new Student2(); s1.setAge(20); s1.setName("zhangsan"); s1.setTeacher(teacher); Student2 s2 = (Student2)s1.clone(); System.out.println(s2.getName()); System.out.println(s2.getAge()); teacher.setName("Teacher Li"); System.out.println(s2.getTeacher().getName()); System.out.println(s2.getTeacher().getAge()); } } class Teacher implements Cloneable { private int age; private String name; 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; } @Override public Object clone() throws CloneNotSupportedException { return super.clone(); //必须调用父了clone方法获取到对象的类型 } } class Student2 implements Cloneable { private int age; private String name; private Teacher teacher; 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 Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } @Override public Object clone() throws CloneNotSupportedException { Student2 student2 = (Student2)super.clone(); //将父类的对象也复制一次 student2.setTeacher((Teacher)student2.getTeacher().clone()); //调用父类的clone方法实现深复制 return student2; } }
· 利用序列化来做深复制
序列化会将对象的所有信息都写入到流中,包或对象中的所有引用信息。可以利用序列化的特点来实现深复制。
package com.bob.clone;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class CloneTest3 {
public static void main(String[] args) throws Exception {
Teacher3 t = new Teacher3();
t.setAge(40);
t.setName("Teacher Zhang");
Student3 s1 = new Student3();
s1.setAge(20);
s1.setName("zhangsan");
s1.setTeacher(t);
Student3 s2 = (Student3) s1.deepCopy();
System.out.println(s2.getAge());
System.out.println(s2.getName());
System.out.println("-----------------------");
System.out.println(s2.getTeacher().getAge());
System.out.println(s2.getTeacher().getName());
s2.getTeacher().setAge(50);
s2.getTeacher().setName("Teacher Li");
System.out.println(s1.getTeacher().getAge());
System.out.println(s1.getTeacher().getName());
}
}
class Teacher3 implements Serializable {
private int age;
private String name;
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;
}
}
class Student3 implements Serializable {
private int age;
private String name;
private Teacher3 teacher;
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 Teacher3 getTeacher() {
return teacher;
}
public void setTeacher(Teacher3 teacher) {
this.teacher = teacher;
}
public Object deepCopy() throws Exception {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
}
相关文章推荐
- 11. JAVA常用类库 Part 4 (对象克隆技术clone、Arrays类、Comparable接口、比较器Comparator、观察者设计模式) ----- 学习笔记
- JAVA 复制对象时为什么要用克隆clone()而不用“=”的原因
- Java常用类库--对象克隆技术clone
- java clone 对象的深复制(深克隆)和浅复制(浅克隆)介绍
- java之实现Cloneable接口的详解,克隆一个对象--对应有浅克隆和深克隆,概念结合代码深入理解
- java对象克隆clone
- java对象克隆clone
- java克隆对象clone()的用法和作用
- java对象 深度克隆(不实现Cloneable接口)和浅度克隆
- Java 对象与集合的克隆 (Clone) 实用类
- 【Java常用类库】_对象克隆技术笔记
- java 深克隆clone对象或容器的另一种方法
- Java 基础数据类型 和 深度克隆对象的2种方法(实现Cloneable接口或者实现对象序列化)
- java知识点总结(==和equals,对象克隆clone等)
- JAVA 对象克隆clone
- 【Java常用类库】_对象克隆技术笔记
- JAVA笔记10__Math类、Random类、Arrays类/日期操作类/对象比较器/对象的克隆/二叉树
- java对象 深度克隆(不实现Cloneable接口)和浅度克隆
- java克隆对象clone()的用法和作用
- java对象 深度克隆(不实现Cloneable接口)和浅度克隆