package com.test;//淺復(fù)制(淺克?。? 淺復(fù)制僅僅復(fù)制所考慮的對(duì)象,而不復(fù)制它所引用的對(duì)象。//深復(fù)制(深克隆):深復(fù)制把要復(fù)制的對(duì)象所引用的對(duì)象都復(fù)制了一遍。////Java中對(duì)象的克隆,為了獲取對(duì)象的一份拷貝,我們可以利用Object類的clone()方法。必須要遵循下面三點(diǎn)//1.在派生類中覆蓋基類的clone()方法,并聲明為public【Object類中的clone()方法為protected的】。//2.在派生類的clone()方法中,調(diào)用super.clone()。//3.在派生類中實(shí)現(xiàn)Cloneable接口。//Object類里的clone方法是淺復(fù)制(淺克隆)public class CloneTest {public static void main(String[] args) throws Exception{//teacher對(duì)象將被clone出來(lái)的Student對(duì)象共享.Teacher teacher = new Teacher();teacher.setAge(40);teacher.setName("Teacher zhang");Student student1 = new Student();student1.setAge(20);student1.setName("zhangsan");student1.setTeacher(teacher);//復(fù)制出來(lái)一個(gè)對(duì)象student2Student student2 = (Student)student1.clone();System.out.println(student2.getAge());System.out.println(student2.getName());System.out.println("~~~~~~~~~~~~~~~~~~~~~~");System.out.println(student1.getTeacher().getAge());System.out.println(student1.getTeacher().getName());//修改student2的引用對(duì)象student2.getTeacher().setAge(50);student2.getTeacher().setName("Teacher Li");System.out.println("~~~~~~~~~~~~~~~~~~~~~~");System.out.println(student1.getTeacher().getAge());System.out.println(student1.getTeacher().getName());}}class Teacher {public int age;public 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 Student implements Cloneable{public int age ;public String name;public 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;}@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}}輸出結(jié)果為:20zhangsan~~~~~~~~~~~~~~~~~~~~~~40Teacher zhang~~~~~~~~~~~~~~~~~~~~~~50Teacher Li
package com.test1;//深clonepublic class DeepCloneTest {public static void main(String[] args) throws Exception{//teacher對(duì)象將不被clone出來(lái)的Student對(duì)象共享.Teacher teacher = new Teacher();teacher.setAge(40);teacher.setName("Teacher zhang");Student student1 = new Student();student1.setAge(20);student1.setName("zhangsan");student1.setTeacher(teacher);//復(fù)制出來(lái)一個(gè)對(duì)象student2Student student2 = (Student)student1.clone();System.out.println(student2.getAge());System.out.println(student2.getName());System.out.println("~~~~~~~~~~~~~~~~~~~~~~");System.out.println(student1.getTeacher().getAge());System.out.println(student1.getTeacher().getName());//修改student2的引用對(duì)象student2.getTeacher().setAge(50);student2.getTeacher().setName("Teacher Li");System.out.println("~~~~~~~~~~~~~~~~~~~~~~");System.out.println(student1.getTeacher().getAge());System.out.println(student1.getTeacher().getName());}}class Teacher implements Cloneable{public int age;public 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;}@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}}class Student implements Cloneable{public int age ;public String name;public 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;}@Overridepublic Object clone() throws CloneNotSupportedException {Student student = (Student)super.clone();//將引用的對(duì)象teacher也clone下student.setTeacher((Teacher)(student.getTeacher().clone()));return student;}}輸出結(jié)果為:20zhangsan~~~~~~~~~~~~~~~~~~~~~~40Teacher zhang~~~~~~~~~~~~~~~~~~~~~~40Teacher zhang
聯(lián)系客服