Object类中的clone()方法是深拷贝还是浅拷贝()
今天有人给我发来一道题,说的是clone()是深拷贝还是浅拷贝,两眼懵比。既然不懂,那就写代码做个记录吧。
首先,了解一下深拷贝和浅拷贝的概念。
当一个对象被拷贝时,拷贝得到的对象内部的引用对象和原对象内部的引用对象地址相等,这是浅拷贝。反之,是深拷贝。
一个对象能被拷贝,需要两个条件:
- 实现
Cloneable
接口。
该接口是个空接口,实现该接口只是使拷贝变得合法,不然会抛异常java.lang.CloneNotSupportedException
。 - 复写
clone()
方法。
public class Animal implements Cloneable {public Cat cat;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}public class Cat {}
测试类:
public class CloneTest {public static void main(String[] args) throws CloneNotSupportedException {
Animal a = new Animal();
a.cat = new Cat();
Animal clone = (Animal) a.clone();
System.out.println("Animal: " + (a == clone));
System.out.println("cat:" + (a.cat == clone.cat));
}
}
打印结果:
Animal: false
cat:true
一开始的问题有答案了,clone()方法是浅拷贝,两个对象中的cat指向堆中同一个对象。
如果想要深拷贝呢?
这时候就需要改造clone方法了,以及引用的对象中也要实现接口和复写方法。
上代码:
public class Animal implements Cloneable {public Cat cat;
@Override
protected Object clone() throws CloneNotSupportedException {
Animal clone = (Animal) super.clone();
// 引用对象也拷贝一份
clone.cat = (Cat) cat.clone();
return clone;
}
}public class Cat implements Cloneable {@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
依旧是上面的测试代码,打印结果为:
Animal: false
cat:false
【Object类中的clone()方法是深拷贝还是浅拷贝()】以上。
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- 为什么你的路演总会超时()
- JS中的各种宽高度定义及其应用
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- Android中的AES加密-下
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 放下心中的偶像包袱吧