一. 核心思想
通过copy(复制)已有的对象来创建的新的对象,从而节省时间和内存。
例如:
- A a = new A() 已有的对象.
- copy对象: A aa = a.clone().
二.写法套路
1. implements Cloneable
2. 重写clone();
3. 在clone()写具体内容
三.简单实现
先看具体代码
public class User implements Cloneable{
public String name = "张三";
public Address address = new Address("广州");
@Override
protected User clone() throws CloneNotSupportedException {
User user = (User)super.clone();
// user.address = this.address.clone(); //深拷贝
return user;
}
//toString方法省略
}
public class Address implements Cloneable{
public String city;
public Address(String city) {
this.city = city;
}
@Override
protected Address clone() throws CloneNotSupportedException {
return (Address) super.clone();
}
}
两个对象, 其中User中有一个变量是Address. 下面看看现象:
现象1:copy后的值和原来的值对比
说明: copy对象成功
现象2:copy后修改name的值
说明: 修改copy后对象的变量(基础变量), 不会对原来的对象产生影响.
现象3:copy后修改Address中city的值
说明: 修改copy后对象变量(变量是对象)里面的值, 原来的对象也会跟着变化. 这种叫浅拷贝. 如果想互不影响, 那就要用深拷贝了.
把上面User的clone()方法中的注释的代码放开, 就可以了.
// user.address = this.address.clone(); //深拷贝
现象3.png
总结: 核心就是copy对象, 只需注意深拷贝和浅拷贝即可.
网友评论