个人备忘--浅克隆与深克隆

来源:互联网 发布:淘宝旺铺基础班页头 编辑:程序博客网 时间:2024/05/22 13:15

浅复制:

package CloneMethod;public class ShallowCopy {public static void main(String[] args) throws CloneNotSupportedException {Student s=new Student("s",12);Teacher t=new Teacher("t",40,s);Teacher ct=(Teacher) t.clone();System.out.println(ct);System.out.println("-------------------------------");//被复制的bean的属性改变不能引起复制对象的改变t.setName("copy t");System.out.println(t);System.out.println(ct);System.out.println("-------------------------------");//复制后的bean的属性改变能引起复制对象的改变ct.setName("copy t");System.out.println(ct);System.out.println("-------------------------------");//对象所引用的另一个对象的属性改变(能够)改变复制对象内的引用属性的改变(浅复制与深复制的区别)s.setName("copy s");System.out.println(ct);}}class Student{int age;String name;public Student(String name,int age){this.age=age;this.name=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;}@Overridepublic String toString() {return "student name:"+name+",age:"+age;}}//复制必须继承Cloneableclass Teacher implements Cloneable{int age;String name;Student s;public Teacher(String name,int age,Student s){this.age=age;this.name=name;this.s=s;}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 Student getS() {return s;}public void setS(Student s) {this.s = s;}@Overridepublic String toString() {return "teacher name:"+name+",age:"+age+"\ninclude:\n"+s;}//讲protected类型改成public类型@Overridepublic Object clone() throws CloneNotSupportedException {//super.clone()只能实现浅复制Object obj=super.clone();return obj;}}

运行结果:

teacher name:t,age:40
include:
student name:s,age:12
-------------------------------
teacher name:copy t,age:40
include:
student name:s,age:12
teacher name:t,age:40
include:
student name:s,age:12
-------------------------------
teacher name:copy t,age:40
include:
student name:s,age:12
-------------------------------
teacher name:copy t,age:40
include:
student name:copy s,age:12

深复制:

package CloneMethod;public class DeepCopy {public static void main(String[] args) throws CloneNotSupportedException {Student s=new Student("s",12);Teacher t=new Teacher("t",40,s);Teacher ct=(Teacher) t.clone();System.out.println(ct);System.out.println("-------------------------------");//被复制的bean的属性改变不能引起复制对象的改变t.setName("copy t");System.out.println(t);System.out.println(ct);System.out.println("-------------------------------");//复制后的bean的属性改变能引起复制对象的改变ct.setName("copy t");System.out.println(ct);System.out.println("-------------------------------");//对象所引用的另一个对象的属性改变(不能够)改变复制对象内的引用属性的改变(浅复制与深复制的区别)s.setName("copy s");System.out.println(ct);}}class Student implements Cloneable{int age;String name;public Student(String name,int age){this.age=age;this.name=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;}@Overridepublic String toString() {return "student name:"+name+",age:"+age;}@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}}//复制必须继承Cloneableclass Teacher implements Cloneable{int age;String name;Student s;public Teacher(String name,int age,Student s){this.age=age;this.name=name;this.s=s;}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 Student getS() {return s;}public void setS(Student s) {this.s = s;}@Overridepublic String toString() {return "teacher name:"+name+",age:"+age+"\ninclude:\n"+s;}//讲protected类型改成public类型@Overridepublic Object clone() throws CloneNotSupportedException {//super.clone()只能实现浅复制Object obj=super.clone();//该方法实现深复制Teacher t=(Teacher) obj;t.setS((Student)t.getS().clone());return obj;}}

运行结果:

teacher name:t,age:40
include:
student name:s,age:12
-------------------------------
teacher name:copy t,age:40
include:
student name:s,age:12
teacher name:t,age:40
include:
student name:s,age:12
-------------------------------
teacher name:copy t,age:40
include:
student name:s,age:12
-------------------------------
teacher name:copy t,age:40
include:
student name:s,age:12