深拷贝和浅拷贝

42 篇文章 0 订阅
本文介绍了Java中的深拷贝和浅拷贝概念,通过一个Person类的示例展示了如何使用clone方法进行拷贝。代码验证显示clone方法执行的是浅拷贝,即对象引用的拷贝,而非实际对象内容的复制。在实际编程中需要注意这一点,以避免不必要的错误。
摘要由CSDN通过智能技术生成

深拷贝和浅拷贝

上面的示例代码中,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() {
10return age;
11}
12. public String getName() {
13.  return name;
14}
15. @Override
16. protected Object clone() throws CloneNotSupportedException {
17return (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 方法执行的是浅拷贝, 在编写程序时要注意这个细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小东子李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值