1、浅克隆
(1)概念
对象的复制,完整地复制一个对象
(2)克隆细节分析
Object类:
依靠Object类,Object类中含有对象的克隆方法
创建并返回此对象的副本。 “复制”的精确含义可能取决于对象的类。
protected Object clone() throws CloneNotSupportedException
Cloneable接口:
该接口无操作方法,是一个标识接口,但是要实现对象的克隆必须实现此接口
(3)克隆操作
实现接口并重写方法:
public class Person implements Cloneable {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
protected Object clone() throws CloneNotSupportedException{
return super.clone();//具体的操作由父类来完成
}
public static void main(String[] args) throws CloneNotSupportedException {
Person person1=new Person("Tom");
Person person2=(Person)person1.clone();
person2.setName("Jack");
System.out.println(person1);
System.out.println(person2);
}
}
实现对象的克隆需要实现Cloneable接口并重写Object类的clone()方法。
测试:
Person{name='Tom'}
Person{name='Jack'}
2、深度克隆(利用序列化和反序列化)
(1)创建Person类并实现序列化接口:
import java.io.Serializable;
public class Person implements Serializable {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
要实现序列化或反序列化必须实现接口Serializable
(2)运用序列化与反序列化实现对象的克隆:
import java.io.*;
public class CloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
Person person1 = new Person("Tom");
try {
ByteArrayOutputStream bas =new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bas);
oos.writeObject(person1);
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bas.toByteArray()));
Person person2 =(Person) ois.readObject();
person2.setName("Jack");
bas.flush();
oos.flush();
bas.close();
oos.close();
ois.close();
System.out.println(person1);
System.out.println(person2);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Person{name='Tom'}
Person{name='Jack'}