| java clone關(guān)鍵字: java clone1.java里的clone分為:  A:淺復(fù)制(淺克?。? 淺復(fù)制僅僅復(fù)制所考慮的對(duì)象,而不復(fù)制它所引用的對(duì)象。 b:深復(fù)制(深克隆):深復(fù)制把要復(fù)制的對(duì)象所引用的對(duì)象都復(fù)制了一遍。 Java中對(duì)象的克隆,為了獲取對(duì)象的一份拷貝,我們可以利用Object類(lèi)的clone()方法。必須要遵循下面三點(diǎn) 1.在派生類(lèi)中覆蓋基類(lèi)的clone()方法,并聲明為public【Object類(lèi)中的clone()方法為protected的】。 2.在派生類(lèi)的clone()方法中,調(diào)用super.clone()。 3.在派生類(lèi)中實(shí)現(xiàn)Cloneable接口。 Object類(lèi)里的clone方法是淺復(fù)制(淺克?。?/span> 淺復(fù)制(淺克隆)的例子如下: 
 package com.test;
//淺復(fù)制(淺克?。? 淺復(fù)制僅僅復(fù)制所考慮的對(duì)象,而不復(fù)制它所引用的對(duì)象。
//深復(fù)制(深克?。荷顝?fù)制把要復(fù)制的對(duì)象所引用的對(duì)象都復(fù)制了一遍。
//
//Java中對(duì)象的克隆,為了獲取對(duì)象的一份拷貝,我們可以利用Object類(lèi)的clone()方法。必須要遵循下面三點(diǎn)
//1.在派生類(lèi)中覆蓋基類(lèi)的clone()方法,并聲明為public【Object類(lèi)中的clone()方法為protected的】。
//2.在派生類(lèi)的clone()方法中,調(diào)用super.clone()。
//3.在派生類(lèi)中實(shí)現(xiàn)Cloneable接口。
//Object類(lèi)里的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ì)象student2
Student 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;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
輸出結(jié)果為:
20
zhangsan
~~~~~~~~~~~~~~~~~~~~~~
40
Teacher zhang
~~~~~~~~~~~~~~~~~~~~~~
50
Teacher Li
2.深復(fù)制(深Clone)例子: 
 package com.test1;
//深clone
public 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ì)象student2
Student 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;
}
@Override
public 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;
}
@Override
public Object clone() throws CloneNotSupportedException {
Student student = (Student)super.clone();
//將引用的對(duì)象teacher也clone下
student.setTeacher((Teacher)(student.getTeacher().clone()));
return student;
}
}
輸出結(jié)果為:
20
zhangsan
~~~~~~~~~~~~~~~~~~~~~~
40
Teacher zhang
~~~~~~~~~~~~~~~~~~~~~~
40
Teacher zhang
3.利用序列化來(lái)做深復(fù)制,把對(duì)象寫(xiě)到流里的過(guò)程是序列化(Serilization)過(guò)程,而把對(duì)象從流中讀出來(lái)的過(guò)程則叫做反序列化(Deserialization)過(guò)程。應(yīng)當(dāng)指出的是,寫(xiě)在流里的是對(duì)象的一個(gè)拷貝,而原對(duì)象仍然存在于JVM里面。,利用這個(gè)特性,可以做深拷貝 
 | 
|  |