java中的clone()方法,顾名思义,会返回一个对象的克隆。那为什么要用到这个方法呢?
当基本类型的属性作为参数传递给方法后,此时的参数是作为一个值传递。无论方法中做什么,这个基本属性自己的值是不会变的。
当一个对象作为参数传递给方法后,此时的参数是一个引用的复制,指向的仍旧是原来的对象,当方法中对这个对象做一些操作,原始属性的对象也会发生相应的变化。(和C/C++的传值引用和传址引用有些类似吧?)
为了防止原始对象被修改,就需要用到clone()方法,此时传递过去的是一个全新的对象,这样就保证了原始对象不会被篡改。
/**
* Created by Anyi on 2017/2/18.
*/
public class ATest {
String name;
public void change(ATest aTest){
ATest.name="hello world";
}
public static void main(String[] args) {
ATest aTest=new ATest();
ATest aTest1=new ATest();
aTest.name="hello";
aTest1.name="world";
System.out.println(aTest.name+","+aTest1.name);
aTest1.change(aTest);
System.out.println(aTest.name+","+aTest1.name);
}
}
如果Class的成员变量是基本类型(外加上String)时候,使用浅克隆即可,如果是数组或者复杂类型则应该使用深克隆。
而clone也分浅克隆和深克隆,浅克隆就是A.clone() 产生了对象B A和B的引用不同 但是A中的属性和B中的属性的引用是相同的
深克隆则是把对象中的属性也是不同的引用。
实现深克隆需要实现Cloneable接口 然后重载clone方法
在clone方法中先调用super类的clone方法把主体克隆,再分别把这个克隆出来的对象的属性对应的进行克隆。
public Object clone() {
A o = null;
try {
o = (A) super.clone();
o.name=(String[])name.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}