概念
浅拷贝
拷贝出当前对象的一个副本,这个新对象和当前对象处于不同的堆内存中,两个对象的基本数据类型的值完全一样,但是引用数据类型还是指向同一个对象的。
 
深拷贝
深拷贝比浅拷贝更进一步,拷贝出当前对象的一个副本,这个新对象和当前对象处于不同的堆内存中,两个对象的基本数据类型的值完全一样,引用数据类型指向的对象也拷贝出了一份一模一样的副本。
 
深拷贝和浅拷贝对比
 
如何使用
1、需要拷贝的对象必须实现 Cloneable 接口
2、重写java.lang.Object类中的 clone() 方法
3、在 clone() 方法中调用 super.clone()
浅拷贝示例
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 
 | 
 public class Address {
 private String country;
 private String province;
 
 public Address() {
 }
 
 public Address(String country, String province) {
 this.country = country;
 this.province = province;
 }
 
 public String getCountry() {
 return country;
 }
 
 public void setCountry(String country) {
 this.country = country;
 }
 
 public String getProvince() {
 return province;
 }
 
 public void setProvince(String province) {
 this.province = province;
 }
 
 @Override
 public String toString() {
 return "Address{" +
 "country='" + country + '\'' +
 ", province='" + province + '\'' +
 '}';
 }
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 
 | 
 public class Student implements Cloneable {
 private int age;
 private String name;
 private Address address;
 
 public Student() {
 }
 
 public Student(int age, String name, Address address) {
 this.age = age;
 this.name = name;
 this.address = address;
 }
 
 public int getAge() {
 return age;
 }
 
 public void setAge(int age) {
 this.age = age;
 }
 
 public String getName() {
 return name;
 }
 
 public void setName(String name) {
 this.name = name;
 }
 
 public Address getAddress() {
 return address;
 }
 
 public void setAddress(Address address) {
 this.address = address;
 }
 
 @Override
 public String toString() {
 return "Student{" +
 "age=" + age +
 ", name='" + name + '\'' +
 ", address=" + address +
 '}';
 }
 
 @Override
 protected Object clone() throws CloneNotSupportedException {
 return super.clone();
 }
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | 
 public class Main {
 public static void main(String[] args) throws CloneNotSupportedException {
 Student s1 = new Student(20, "a", new Address("中国", "张家界"));
 Student s2 = (Student) s1.clone();
 System.out.println(s1);
 System.out.println(s2);
 System.out.println(s1 == s2);
 System.out.println(s1.getAddress() == s2.getAddress());
 }
 }
 
 | 
| 12
 3
 4
 5
 6
 
 | //运行结果
 Student{age=20, name='a', address=Address{country='中国', province='张家界'}}
 Student{age=20, name='a', address=Address{country='中国', province='张家界'}}
 false
 true
 
 | 
深拷贝示例
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 
 | 
 public class Address implements Cloneable {
 private String country;
 private String province;
 
 public Address() {
 }
 
 public Address(String country, String province) {
 this.country = country;
 this.province = province;
 }
 
 public String getCountry() {
 return country;
 }
 
 public void setCountry(String country) {
 this.country = country;
 }
 
 public String getProvince() {
 return province;
 }
 
 public void setProvince(String province) {
 this.province = province;
 }
 
 @Override
 public String toString() {
 return "Address{" +
 "country='" + country + '\'' +
 ", province='" + province + '\'' +
 '}';
 }
 
 @Override
 protected Object clone() throws CloneNotSupportedException {
 return super.clone();
 }
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 
 | 
 public class Student implements Cloneable {
 private int age;
 private String name;
 private Address address;
 
 public Student() {
 }
 
 public Student(int age, String name, Address address) {
 this.age = age;
 this.name = name;
 this.address = address;
 }
 
 public int getAge() {
 return age;
 }
 
 public void setAge(int age) {
 this.age = age;
 }
 
 public String getName() {
 return name;
 }
 
 public void setName(String name) {
 this.name = name;
 }
 
 public Address getAddress() {
 return address;
 }
 
 public void setAddress(Address address) {
 this.address = address;
 }
 
 @Override
 public String toString() {
 return "Student{" +
 "age=" + age +
 ", name='" + name + '\'' +
 ", address=" + address +
 '}';
 }
 
 @Override
 protected Object clone() throws CloneNotSupportedException {
 Student student = (Student) super.clone();
 student.address = (Address) address.clone();
 return student;
 }
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | 
 public class Main {
 public static void main(String[] args) throws CloneNotSupportedException {
 Student s1 = new Student(20, "a", new Address("中国", "张家界"));
 Student s2 = (Student) s1.clone();
 System.out.println(s1);
 System.out.println(s2);
 System.out.println(s1 == s2);
 System.out.println(s1.getAddress() == s2.getAddress());
 }
 }
 
 | 
| 12
 3
 4
 5
 6
 
 | //运行结果
 Student{age=20, name='a', address=Address{country='中国', province='张家界'}}
 Student{age=20, name='a', address=Address{country='中国', province='张家界'}}
 false
 false
 
 | 
参考