浅拷贝
定义:将对象的引用复制了一份,即两个不同的引用指向了同一个内存地址,那么在改变任一个引用的值都是在改变这个内存地址的所存储的值,因为它们作用的对象是同一个内存地址,所以两个变量的值都会改变。
代码如下:
Student student=new Student("张三",20);
Student student1=student;
System.out.println(student); //张三 20
System.out.println(student1); //张三 20
运行结果:
Student@1540e19d
Student@1540e19d
上述代码中student和student1的内存地址是同一个,现在修改student1的姓名,代码如下:
student1.setName("王五");
System.out.println(student); //王五 20
System.out.println(student1); //王五 20
我们可以看到,浅拷贝作用的是同一个内存地址。
深拷贝
clone方法:在Java中是用clone()方法实现深拷贝的,除了对象本身被复制外,对象所包含的所有成员变量也将复制。这里需要注意,clone方法在Object类中的修饰符是protected修饰的,所以Student类需要实现Cloneable接口,然后重写clone方法。
代码如下:
Student student=new Student("张三",20);
Student student1 = (Student)student.clone();
System.out.println(student); //张三 20
System.out.println(student1); //张三 20
运行结果:
Student@4554617c
Student@74a14482
我们可以发现用clone方法创建的对象才是新开辟了一个空间。
问题探讨
上述深拷贝的代码中student和student1中的姓名属性和年龄属性是深拷贝还是浅拷贝?
由于判断是深拷贝还是浅拷贝,我们只需要判断内存地址是否相同即可,于是我们可以这样验证。
代码如下:
Student student=new Student("张三",20);
Student student1 = (Student)student.clone();
System.out.println(student);
System.out.println(student1);
String s=student.getName()==student1.getName()?"浅拷贝":"深拷贝";
System.out.println(s);
String s1=student.getAge()==student1.getAge()?"浅拷贝":"深拷贝";
System.out.println(s1);
运行结果:
Student@4554617c
Student@74a14482
浅拷贝
浅拷贝
说明姓名和年龄属性指向的是同一个内存地址,只不过引用不同,那么我们怎样才可以实现姓名和年龄的引用不同,同时内存地址也不同的深拷贝呢?这个问题下期解答。谢谢观看!