一、解决什么问题?
- 用于创建重复的对象,同时又能保证性能。
二、如何使用?
- 首先定义一个User类,它必须实现了Cloneable接口,重写了clone()方法。
public class User implements Cloneable {
private String name;
private int age;
private Brother brother;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
- Brother类
public class Brother{
private String name;
}
- 应用演示类
public class PrototypeDemo {
public static void main(String[] args) throws CloneNotSupportedException {
User user1 = new User();
user1.setName("秋红叶");
user1.setAge(20);
Brother brother1 = new Brother();
brother1.setName("七夜圣君");
user1.setBrother(brother1);
// 我们从克隆对象user2中修改brother,看看是否会影响user1的brother
User user2 = (User) user1.clone();
user2.setName("燕赤霞");
Brother brother2 = user2.getBrother();
brother2.setName("唐钰小宝");
System.out.println(user1);
System.out.println(user2);
System.out.println(user1.getBrother() == user2.getBrother());
}
}
- 深拷贝写法
4.1 这是User类
public class User implements Cloneable {
private String name;
private int age;
private Brother brother;
/**
* 主要就是看这个重写的方法,需要将brother也进行clone
*/
@Override
protected Object clone() throws CloneNotSupportedException {
User user = (User) super.clone();
user.brother = (Brother) this.brother.clone();
return user;
}
}
4.2 这是Brother类
public class Brother implements Cloneable{
private String name;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
4.3 这里是结果演示
public class PrototypeDemo {
public static void main(String[] args) throws CloneNotSupportedException {
User user1 = new User();
user1.setName("秋红叶");
user1.setAge(20);
Brother brother1 = new Brother();
brother1.setName("七夜圣君");
user1.setBrother(brother1);
// 我们从克隆对象user2中修改brother,看看是否会影响user1的brother
User user2 = (User) user1.clone();
user2.setName("燕赤霞");
Brother brother2 = user2.getBrother();
brother2.setName("唐钰小宝");
System.out.println(user1);
System.out.println(user2);
System.out.println(user1.getBrother() == user2.getBrother());
}
}
4.4 可以看到,user1的brother没有受到user2的影响,深拷贝成功!
4.5 图解深拷贝与浅拷贝
三、总结与思考
- java中object类的clone()方法为浅拷贝
- 必须实现Cloneable接口
- 如果想要实现深拷贝,则需要重写clone()方法