解读:Object中的clone方法为native,解释了java的“高效”。实现Cloneable接口的类经过super.clone()调用来实现克隆能力(标准写法)。克隆是按属性字段复制的,若是对象的属性值为可变的引用(不可变:如基本类型,final类型的,可变:如对象的引用,数组引用),那原对象跟克隆后的对象将没法保持独立,由于他们的某个属性共同引用了一个对象,这就是“浅表复制”,这不是咱们想要的,正常咱们须要的是“深层复制 ”,即对对象的属性进行进一步的clone,for example:
public class A implements Cloneable {
public B b;
public A() {
b = new B();
}
public Object clone() {
A o = null;
try {
o = (A) super.clone();
o.b = (B) b.clone();
//属性b的克隆,实现A类的深度克隆
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}
public static void main(String[] args) throws CloneNotSupportedException {
A A_a = new A();
A copyA = A_a;//
copyA.b.setName("i'm copyA from A...");
A cloneA = (A) A_a.clone();
cloneA.b.setName("i'm clone from A...");
System.out.println(cloneA.b.getName());//out :i'm clone from A...
System.out.println(A_a.b.getName());//out :i'm copyA from A...
if (cloneA.equals(A_a)) {
System.out.println("cloneA.equals(A_a) really? no"); //no out
}
if (copyA.equals(A_a)) {
System.out.println("copyA.equals(A_a) -really? yes");//out
}
}
class B implements Cloneable {
String name;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}