1、拷贝的目的
大家先思考一个问题,为什么需要克隆对象?直接new一个对象不行吗?
克隆的对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。那么我把这个对象的临时属性一个一个的赋值给我新new的对象不也行嘛?可以是可以,但是一来麻烦不说,二来,clone是一个native方法,在底层实现的,运行速度上肯定是更快的。
2、浅拷贝
2.1、引用拷贝
Person类:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person implements Cloneable{
private String name;
private Address address;
@Override
public Object clone() {
//浅拷贝
Person p = null;
try{
p = (Person) super.clone();
}catch (CloneNotSupportedException e){
e.printStackTrace();
}
return p;
}
}
Address类:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Address {
private String city;
private String area;
}
- 创建一个指向对象的引用变量的拷贝。
@Test
public void test1(){
//传递引用(浅拷贝)
Person p1 = new Person("小明", new Address("长沙","天心区"));
Person p2 = p1;
System.out.println("p1 :" + p1);
System.out.println("p2 :" + p2);
输出:
//修改前
p1 :Person(name=小明, address=Address(city=长沙, area=天心区))
p2 :Person(name=小明, address=Address(city=长沙, area=天心区))
从这里看一切都与预想的一致,完成了拷贝。
但是,来修改一下内容
p2.setName("大红");
p1.getAddress().setCity("广州");
System.out.println("p1 :" + p1);
System.out.println("p2 :"