java中深拷贝与浅拷贝的区别

1.定义
一听到拷贝二字,很容易想到一个单词“copy”,对,就是复制的意思。那么它的作用也就是为了方便嘛。如果从字面意思上来说,深拷贝它拷贝的程度或者说级别深一点,而浅拷贝就比较浅一些。具体来说浅拷贝能复制变量,如果对象内还有对象,则只能复制对象的地址;而深拷贝能复制变量,也能复制当前对象的内部对象。注意,浅拷贝需要实现 Cloneable接口。下面用代码再进行进一步的分析。
人家说的更详细

浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。举例来说更加清楚:对象A1中包含对B1的引用,B1中包含对C1的引用。浅拷贝A1得到A2,A2
中依然包含对B1的引用,B1中依然包含对C1的引用。深拷贝则是对浅拷贝的递归,深拷贝A1得到A2,A2中包含对B2(B1的copy)的引用,B2
中包含对C2(C1的copy)的引用。

2.代码
① 浅拷贝:

class Teacher implements Cloneable {
 String name;
 int age;Teacher(String name, int age) {
this.name = name;
 this.age = age;
 }public Object clone() throws CloneNotSupportedException {
 return super.clone();
 }
 }class Student implements Cloneable {
 String name;// 常量对象。
 int age;
 Teacher t;// 学生1和学生2的引用值都是一样的。Student(String name, int age, Teacher t) {
this.name = name;
 this.age = age;
 this.t = t;
 }public Object clone() {
 Student0 o = null;
 try {
 o = (Student) super.clone();
 } catch (CloneNotSupportedException e) {
 System.out.println(e.toString());
 }return o;
 }
 }public class CopyTest {
 public static void main(String[] args) {
 Teacher t = new Teacher(“wangwu”, 50);
 Student s1 = new Student0(“zhangsan”, 18, p);
 Student s2 = (Student) s1.clone();
s2.t.name = “lisi”;
 s2.t.age = 30;
s2.name = “z”;
 s2.age = 45;
 System.out.println(“学生s1的姓名:” + s1.name + “\n学生s1教授的姓名:” + s1.t.name + “,” + “\n学生s1教授的年纪” + s1.t.age);// 学生1的教授
 }
 }


可以明显的看出,s和s1都变了,相对应的t的属性也变了,说明s和是s1指向的是同一个对象。

  • 下来看一下深拷贝的案例
class Teacherimplements Cloneable {
 String name;
 int age;Teacher(String name, int age) {
this.name = name;
 this.age = age;
 }
 public Object clone() {
 Object o = null;
 try {
 o = super.clone();
 } catch (CloneNotSupportedException e) {
 System.out.println(e.toString());
 }
 return o;
 }
 }class Student implements Cloneable {
 String name;
 int age;
 Teacher t;
 Student(String name, int age,Teacher t) {
this.name = name;
 this.age = age;
 this.t = t;
 }public Object clone() {
 Student o = null;
 try {
 o = (Student) super.clone();
 } catch (CloneNotSupportedException e) {
 System.out.println(e.toString());
 }
 o.p = (Teacher ) p.clone();
 return o;
 }
 }public class DeepCopyTest{
 public static void main(String args[]) {
 long t1 = System.currentTimeMillis();
 Teacher t = new Teacher (“wangwu”, 50);
 Student s1 = new Student(“zhangsan”, 18, p);
 Student s2 = (Student) s1.clone();
s2.t.name = “lisi”;
 s2.t.age = 30;
 System.out.println(“name=” + s1.t.name + “,” + “age=” + s1.t.age);// 学生1的教授不改变。
 long t2 = System.currentTimeMillis();
 System.out.println(t2-t1);
 }
 }
  • 综上所述,浅拷贝是只对指针进行拷贝,两个指针指向同一个内存块,深拷贝是对指针和指针指向的内容都进行拷贝,拷贝后的指针是指向不同内的指针。