定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
实体类:
public class User implements Cloneable{
private String username;
private String password;
private ArrayList<User> arrayList = new ArrayList<>(10);
public User(String username, String password) {
this.username = username;
this.password = password;
}
@Override
protected Object clone() throws CloneNotSupportedException {
User user = null;
user = (User) super.clone();
return user;
}
public void add(User user) {
arrayList.add(user);
}
public void delete(User user) {
arrayList.remove(user);
}
public ArrayList<User> get() {
return arrayList;
}
@Override
public String toString() {
return "User{" +
"username=‘" + username + ‘\‘‘ +
", password=‘" + password + ‘\‘‘ +
‘}‘;
}
}
注意:实体类必须实现
cloneable
接口,并且重写clone方法
测试类
User user = new User("root","root");
final User clone = (User) user.clone();
System.out.println(user == clone);
user.add(user);
clone.add(clone);
System.out.println(user.get());
执行结果:
- clone方法并不是复制引用,而是复制一个新的对象,分配了一个新的地址
- clone是native方法,底层是在内存中直接二进制流赋值对象,比new一个对象更快
- clone仅仅复制
原始类型(int,float,double等等)
,加上一个String
类型,对于引用类型变量,仅仅复制引用,因此,user对象和clone对象共享arraylist.- 改进,实现深拷贝
@Override
protected Object clone() throws CloneNotSupportedException {
User user = null;
user = (User) super.clone();
user.arrayList = (ArrayList<User>) this.arrayList.clone();
return user;
}
没错,就是手动复制引用类型的变量
原文:https://www.cnblogs.com/codezpc/p/12769834.html