**浅克隆:** 只copy对象引用,不copy对象本身。即对象地址不变,仍然只存在一个对象。
例如: `User user1 = new User; User user2 = user1;`
这里引用类型对象地址不变,只是将user2的引用指向user1的地址。
浅克隆代码示例:
Bean:
public class User {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
Main:
public class TestMain {
public static void main(String[] args) throws CloneNotSupportedException {
User user = new User();
user.setId(1);
user.setName("AAA");
User user2 = user;
user2.setName("BBB");
System.out.println(user);
System.out.println(user2);
}
}
运行结果:
User{id=1, name='BBB'}
User{id=1, name='BBB'}
**深克隆:** 不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。也就是clone出来的是一个全新的对象,引用地址不同,但是内容相同(跟新new对象进行相同赋值效果一样,但是速度更快:因为clone是一个native方法)。
深克隆分为三步:
1. 对象的类实现Cloneable接口(必须,否则会抛出CloneNotSupportedException异常);
2. 覆盖Object类的clone()方法 (覆盖clone()方法,将访问修饰符改为public,默认是protected);
3. 在clone()方法中调用super.clone();
**深克隆示例:**
Bean:
/**
* @author :zhangh
* @description :
* @date :Created at 2019/6/3 10:03
* Modified at 2019/6/3 10:03
*/
/**
对象的类实现Cloneable接口;
覆盖Object类的clone()方法 (覆盖clone()方法,访问修饰符设为public,默认是protected);
在clone()方法中调用super.clone();
*/
public class User implements Cloneable{
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
@Override
public User clone() throws CloneNotSupportedException {
return (User) super.clone();
}
}
Main:
/**
* @author :zhangh
* @description :
* @date :Created at 2019/6/3 10:02
* Modified at 2019/6/3 10:02
*/
public class TestMain {
public static void main(String[] args) throws CloneNotSupportedException {
User user = new User();
user.setId(1);
user.setName("AAA");
User user2 = user.clone();
user2.setName("BBB");
System.out.println(user);
System.out.println(user2);
}
}
运行结果:
User{id=1, name='AAA'}
User{id=1, name='BBB'}