java克隆须知

解读: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;
        }
    }
}
相关文章
相关标签/搜索