深拷贝和浅拷贝
Posted 小东子李
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深拷贝和浅拷贝相关的知识,希望对你有一定的参考价值。
深拷贝和浅拷贝
上面的示例代码中,Person 中有两个成员变量,分别是 name 和 age, name 是 String 类型, age 是 int 类
型。代码非常简单,如下所示:
1.public class Person implements Cloneable{
2.privatint age ;
3. private String name;
4. public Person(int age, String name) {
5. this.age = age;
6. this.name = name;
7. }
8. public Person() {}
9. public int getAge() {
10. return age;
11. }
12. public String getName() {
13. return name;
14. }
15. @Override
16. protected Object clone() throws CloneNotSupportedException {
17. return (Person)super.clone();
18. }
19.}
由于 age 是基本数据类型,那么对它的拷贝没有什么疑议,直接将一个 4 字节的整数值拷贝过来就行。但是 name
是 String 类型的, 它只是一个引用, 指向一个真正的 String 对象,那么对它的拷贝有两种方式: 直接将原对象中
的 name 的引用值拷贝给新对象的 name 字段, 或者是根据原 Person 对象中的 name 指向的字符串对象创建一个
新的相同的字符串对象,将这个新字符串对象的引用赋给新拷贝的 Person 对象的 name 字段。这两种拷贝方式分别
叫做浅拷贝和深拷贝。深拷贝和浅拷贝的原理如下图所示:
下面通过代码进行验证。如果两个 Person 对象的 name 的地址值相同, 说明两个对象的 name 都指向同一个
String 对象,也就是浅拷贝, 而如果两个对象的 name 的地址值不同, 那么就说明指向不同的 String 对象, 也就
是在拷贝 Person 对象的时候, 同时拷贝了 name 引用的 String 对象, 也就是深拷贝。验证代码如下:
14. Person p = new Person(23, "zhang");
15. Person p1 = (Person) p.clone();
16. String result = p.getName() == p1.getName()
17. ? "clone 是浅拷贝的" : "clone 是深拷贝的";
18. System.out.println(result);
打印结果为:
6. clone 是浅拷贝的
所以,clone 方法执行的是浅拷贝, 在编写程序时要注意这个细节。
以上是关于深拷贝和浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章