深克隆与浅克隆的概念
一:
浅克隆:被复制对象的所有变量都含有与原来的对象相同的值,面所有的对其他对象的
引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用
的对象(就是只复制对应所复制的对象)
深克隆 :
被复制的对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量
。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对
象。深复制就是把要复制的对象和引用的对象都复制一遍 把整个过程都复制一遍。
二:clone方法满足条件
clone方法将对象复制一份返回给调用的人
2.1 对于任何对象x,都有x.clone != x 克隆的对象与原对像不是一个对象
2.2 对于任何对象x,都有 x.clone.getClass == x.getClass class表示类型 克
隆的类型与原类型一样。
2.3 对于x的equals()的方法 ,并且重写equals恰当的话 会有x.clone().equals
(x) 返回true 相等。比较的是内容。
三:Java中对象的克隆
1.我们要获取对象的一份复制文件,我们可以利用Java的Object类的clone()方法
2..在派生类中覆盖的基类的clone()方法,要声明public类 (因为原生的clone方
法是private私有的受保护的 ,我们声明为公共的可以调用)
3.在派生类的clone()方法中,调用super.clone()。 (在第一行调用,因为在运行
的时刻,Object中的clone()识别出你要复制的是哪一个对象,然后为此对象分配空
间,并进行对象的复制,将原始对象的内容--复制到新的对象存储空间中;继承自
Java.lang.Object类的 clone()方法是浅复制)
4.在派生类中实现Cloneable接口。
四:实现clone()的浅复制(代码) 创建一个学生类 使用复制必须实现
Cloneable接口
package Test;
/**
* @author Administrator
*/
public class Students1 implements Cloneable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public Object clone() throws CloneNotSupportedException {
Object object = super.clone();
return object;
}
@Override
public String toString() {
return "Students1{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
4.2实现main方法
4.3 从侧面证明了 X.clone () != x 浅复制 只是对目标对象进行复制
五:实现clone()的浅复制(代码)
public class Teacher implements Cloneable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package Test;
/**
* @author Administrator
*/
public class Students12 implements Cloneable {
private String name;
private int age ;
private Teacher teacher;
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public Object clone() throws CloneNotSupportedException {
Object object = super.clone();
return object;
}
}
package Test;
/**
* @author Administrator
*/
public class TeacherCloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
Teacher teacher = new Teacher();
teacher.setName("张老师");
teacher.setAge(40);
Students12 s1 = new Students12();
s1.setName("张三");
s1.setAge(20);
s1.setTeacher(teacher);
Students12 s2 = (Students12) s1.clone();
System.out.println(s2.getName());
System.out.println(s2.getAge());
teacher.setName("li");
System.out.println(s2.getTeacher().getName());
System.out.println(s2.getTeacher().getAge());
}
}
5.结果为
、
所以我们 要在 Teacher 进行复制 然后在Student112里面 复制
代码 改变为
package Test;
/**
* @author Administrator
*/
public class Teacher implements Cloneable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
package Test;
/**
* @author Administrator
*/
public class Students12 implements Cloneable {
private String name;
private int age ;
private Teacher teacher;
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public Object clone() throws CloneNotSupportedException {
Students12 students12 = (Students12) super.clone();
students12.setTeacher((Teacher) students12.getTeacher().clone());
return students12;
}
}
5.2main 方法里面不变
完成。即使修改了对象也不改变 已复制过的值 (。深复制就是把要复制的对象和引用的对象都复制一遍 把整个过程都复制一遍。)