目录:
1.如何实现Cloneable接口?
2. 什么是浅拷贝? 什么是深拷贝?
1.如何实现Clonable接口?
实现Cloneable接口,需要注意一下四步:
第一步:一个类首先先实现Clonable接口
class Money implements Cloneable
第二步:重写clone方法
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
第三步:main函数抛异常
public static void main(String[] args) throws CloneNotSupportedException
第四步:类型转换 ,因为clone是Object的方法,此时也叫做向下转型
Person person2 = (Person)person.clone();
2. 什么是浅拷贝? 什么是深拷贝?
- class Money {
- public double m = 99.99;
- }
-
- class Person implements Cloneable{
- public Money money = new Money();
-
- @Override
- protected Object clone() throws CloneNotSupportedException {
- return super.clone();
- }
- }
-
- public class TestDemo3 {
- public static void main(String[] args) throws CloneNotSupportedException {
- Person person1 = new Person();
- Person person2 = (Person) person.clone();
- System.out.println("通过person2修改前的结果");
- System.out.println(person1.money.m);
- System.out.println(person2.money.m);
- person2.money.m = 13.6;
- System.out.println("通过person2修改后的结果");
- System.out.println(person1.money.m);
- System.out.println(person2.money.m);
- }
- }
-
- // 执行结果
- 通过person2修改前的结果
- 99.99
- 99.99
- 通过person2修改后的结果
- 13.6
- 13.6
如上代码,我们可以看到,通过clone,我们只是拷贝了Person对象。但是Person对象中的Money对象,并没有拷贝。通过person2这个引用修改了m的值后,person1这个引用访问m的时候,值也发生了改变。这里就是发生了浅拷贝。
- class Person implements Cloneable{
- public Money money = new Money();
-
- @Override
- protected Object clone() throws CloneNotSupportedException {
- Person tmp = (Person) super.clone();
- tmp.money = (Money) this.money.clone();
- return tmp;
- }
