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;
@Override
protected 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;
}
@Override
protected Object clone()
throws CloneNotSupportedException {
Person tmp=(Person)super.clone();
tmp.money= (Money)tmp.money.clone();
return tmp;
}
}
这里要特别注意类型转化!!!
3:运行结果
加油!!!!!!!!