定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
就像复印一样。将一个原件复印n多份,复印件有原件的全部信息,而且彼此独立。再举个例子,抄作业,虽然是抄,但是该有的态度还是有吧,总不能写一个与xxx同学一样就完事了吧,得把内容也全部誊抄下来吧。
但是全抄一样的吧,老师一眼看出来,就把分扣没了 (想起高中时月考给后桌抄主观题,那哥们一字未改,我俩雷同卷都被判0分) 。所以我们也可以进行一些修改。
在Java中有一个Cloneable的接口,里面没有实际的方法,这是一个指示性接口,说明本类实现了clone方法。
就以抄作业那个为例子进行说明
首先是作业类
class HomeWork implements Cloneable{
private String text;
private String name;
public HomeWork(String text,String name) {
this.text = text;
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public void setText(String text) {
this.text = text;
}
public HomeWork clone(){
try {
return (HomeWork) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
@Override
public String toString() {
return "HomeWork{" +
"text='" + text + '\'' +
", name='" + name + '\'' +
'}';
}
}
测试代码:
总不能名都跟人抄一样吧。
@Test
public void testY(){
HomeWork homeWork = new HomeWork("今天天气真好","XXX");
HomeWork copy = homeWork.clone();
System.out.println(homeWork);
copy.setName("YYY");
System.out.println(copy);
System.out.println(copy==homeWork);
}
注意这是个浅复制方法,如果值类型的属性,直接复制不影响,如果是引用类型,复制的是引用而不是将对象复制了一遍。
如果需要简单的深复制,只需要复制那些对象,然后手动赋值即可。
可以看一下ArrayList的clone方法:
就是先复制一个框架,然后再把元素逐一赋值。
public Object clone() {
try {
ArrayList<?> v = (ArrayList<?>) super.clone();
v.elementData = Arrays.copyOf(elementData, size);
v.modCount = 0;
return v;
} catch (CloneNotSupportedException e) {
// this shouldn't happen, since we are Cloneable
throw new InternalError(e);
}
}
应用场景…需要复制的场景啊…比如有时候不能将对象发布,但是需要将它的内容发布的时候。