1、Cloneable是一个标记接口,没有成员,只有实现了接口,成为它的子类,jvm才允许这个子类
重写clone方法。标记接口,就好像在你身上贴个标记,有这个标记的人才可以到这个论坛来转悠。
还有一个标记接口Serializable,实现了它,标志你能被序列化,即能往外设里面写。
2、这样的标记给java虚拟机好确认:只有拥有什么-----才能干什么;
否则jvm就给你抛出异常。CloneNotSupportedException 你不支持拷贝
3、对应Cloneable方法,它是为一个对象在内存中创建一个同卵兄弟,这兄弟两个拥有完全相同的东西,不过它们不能共享任何相同的东西,就是说它们身上的任何一个元素,都有2份。
4我写一个实现Clone方法的小例子,代码如下:
public class CloneExp implements Cloneable {
private String name;
private String address;
private int age;
private Department depart;
public CloneExp() {
}
public CloneExp(String aName,String address, int aAge, Department aDepart) {
this.name = aName;
this.address=address;
this.age = aAge;
this.depart = aDepart;
}
protected Object clone() throws CloneNotSupportedException {
CloneExp clone = (CloneExp) super.clone();
// 执行Department的一个浅拷贝
clone.depart = (Department) depart.clone();
return clone;
}
public static void main(String[] args) {
Department aDepart=new Department("销售部");
CloneExp ce = new CloneExp("张三","湖北",30,aDepart);
CloneExp cloned=null;
try {
// 执行CloneExp的深拷贝
cloned = (CloneExp) ce.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
/*
* 测试:①x.clone() != x 真
* ②x.clone().getClass() == x.getClass() 真
* ③x.clone().equals(x) 真
*/
System.out.println(cloned!=ce);
System.out.println(cloned.getClass()==ce.getClass());
System.out.println(cloned.equals(ce));
}
}
class Department implements Cloneable{
private String depname;
public Department(){
}
public boolean equals(Department dep) {
// TODO Auto-generated method stub
return depname.equals(dep.depname);
}
public Department(String depname){
this.depname=depname;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
Department clone=(Department)super.clone();
return clone;
}
} |