Java中有两种拷贝方式一种是浅拷贝,一种是深拷贝。
两者的区别也很好阐述:浅拷贝它只是简单拷贝对象成员的引用,而深拷贝则会重新生成一个对象副本。当然String这些对象比较特殊。
举个实例:(注意看注释)
package clone;
public class Teacher implements Cloneable {
public String name;
public int age;
public Teacher(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public Object clone() {
Object obj=null;
try {
obj=super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj;
}
@Override
public String toString() {
return "Teacher [name=" + name + ", age=" + age + "]";
}
}
package clone;
public class Student implements Cloneable {
public Teacher teacher;
public String name;
public int age;
public Student(Teacher teacher, String name, int age) {
super();
this.teacher = teacher;
this.name = name;
this.age = age;
}
//浅拷贝
@Override
public Object clone() {
Object obj=null;
try {
obj=super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj;
}
//深拷贝
public Student clone(boolean flag) {
Student student=null;
try {
student=(Student) super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
student.teacher=(Teacher) student.teacher.clone();
return student;
}
@Override
public String toString() {
return "Student [teacher=" + teacher + ", name=" + name + ", age="
+ age + "]";
}
}
package clone;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Teacher teacher;
Student student;
Student clone_student;
teacher=new Teacher("程老师", 20);
student=new Student(teacher, "小猿", 12);
//浅拷贝
clone_student=(Student) student.clone();
System.out.println(teacher);
clone_student.age=18;clone_student.name="大猿";//改变int和String不会影响原本的类
clone_student.teacher.age=40; //改变对象成员就会影响
System.out.println(student);
System.out.println(clone_student);
System.out.println(teacher);
}
}
运行结果:
Teacher [name=程老师, age=20]
Student [teacher=Teacher [name=程老师, age=40], name=小猿, age=12]
Student [teacher=Teacher [name=程老师, age=40], name=大猿, age=18]
Teacher [name=程老师, age=40]
package clone;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Teacher teacher;
Student student;
Student clone_student;
teacher=new Teacher("程老师", 20);
student=new Student(teacher, "小猿", 12);
//深拷贝
clone_student=(Student) student.clone(true);
System.out.println(teacher);
clone_student.age=18;clone_student.name="大猿";
//改变对象成员也不会影响 原本类里放的是上面的那个teacher的引用 而克隆的是新的对象
student.teacher.age=40;
clone_student.teacher.age=44;
System.out.println(student);
System.out.println(clone_student);
System.out.println(teacher);
}
}
运行结果:
Teacher [name=程老师, age=20]
Student [teacher=Teacher [name=程老师, age=40], name=小猿, age=12]
Student [teacher=Teacher [name=程老师, age=44], name=大猿, age=18]
Teacher [name=程老师, age=40]