Java中Object类当中有许多方法,如图所示:
clone方法就是其中一种,分为浅拷贝,深拷贝举一个例子:
浅拷贝:
在Person类当中右键鼠标然后,选中Generate:
然后重写clone方法
protected Object clone() throws CloneNotSupportedException {return super.clone();}
重写完还是不能使用,需要一下几个步骤:
1:implements Cloneable这个接口
(这个Cloneable接口是标记接口,意味着这个类可以进行克隆)
public class Person implements Cloneable
2:由于这个方法返回类型是Object类,所以这里需要强制类型转换才能使用
3:强制类型转换成Person后还需要
4:运行结果:
深拷贝:
1:浅拷贝的缺陷
public class Test {public static void main(String[] args)throws CloneNotSupportedException {Person person1=new Person("zhangsan",18);Person person2=(Person)person1.clone();person2.money.m=10;System.out.println("person1:"+person1.money.m);System.out.println("person2:"+person2.money.m);}
}
当我们写出这样的代码,改变person2.money.m的值会影响person.money.m的值,这里我们不难发现,person2.money和person.money存的地址是相同的,所以会互相影响。
2:解决方法
a:在Money类中也重写clone方法
public class Money implements Cloneable{public int m;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
b:修改Person类中的clone方法
public class Person implements Cloneable{public String name;public int age;public Money money=new Money();public Person(String name,int age){this.age=age;this.name=name;}@Overrideprotected Object clone()throws CloneNotSupportedException {Person tmp=(Person)super.clone();tmp.money= (Money)tmp.money.clone();return tmp;}
}
这里要特别注意类型转化!!!
3:运行结果
加油!!!!!!!!