1.Object.clone()
protected native Object clone() throws CloneNotSupportedException;
创建并返回这个对象的拷贝。
注意它的权限是protected的,所以不能直接用。
注意它是native方法,所以比直接new对象效率高。
2.接口
public interface Cloneable {}
此接口不包含任何方法,是给jvm看的。
类A是否实现该接口, 会影响到A中调用 super.clone() 的行为. 这设计得很差.
3.使用
实现Cloneable接口,并重写clone()方法,注意权限要改为public。注意要调用super.clone()。
效果为创建一个新对象,然后逐字段地拷贝,由jvm实现。对于引用类型,jvm只帮你浅拷贝,需要深拷贝的话还得自己实现。
在重写equals()方法后,效果为 x.clone() != x成立,x.clone().equals(x)成立。
例子:
class Peach implements Cloneable{
public int weight;
public String color;
public Peach(int x,String a){
weight=x;color=a;
}
public Peach clone() throws CloneNotSupportedException {
Peach o=(Peach) (super.clone());
o.color=new String(color);//要想实现深度复制,必须手动对非基本类型进行复制
return o;
}
@Override
public boolean equals(Object o){
return o instanceof Peach &&color.equals(((Peach)o).color)&& weight==(((Peach)o).weight);
}
}
public class A {
public static void main(String[] args) throws CloneNotSupportedException {
Peach a=new Peach(1,"pink");
Peach b=a.clone();
System.out.println(a.equals(b));
System.out.println(a.color==b.color);
System.out.println(a==b);
}
}
/*true
false
false
*/