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'}