Java clone()方法详解

package common;

import java.util.ArrayList;
import java.util.List;

import action.LoginAction;

/**
 * Object.clone()方法为影子(浅)克隆,例如将对象A克隆出个B,
 * 那么先根据A的大小分配B的空间,创建B对象,然后遍历A的域对象进行克隆。
 * 克隆域对象时,如果是基本类型则重新创建对象然后赋值,包括String类型
 * 对于非基本类型,则是复制引用,引用指向原域对象,修改其中一个另外一个就会改变
 *
 * 至于深度克隆,这是将 原来对象的属性和引用属性全部复制一份
 * @author xubo
 *
 */
public class CloneTest implements Cloneable {

    public List<String> a = new ArrayList<String>();

    public String b = new String("sss");

    public LoginAction c = new LoginAction();

    public String getB() {

        return b;
    }

    public void setB(String b) {

        this.b = b;
    }

    public List<String> getA() {

        return a;
    }

    public void setA(List<String> a) {

        this.a = a;
    }

    public LoginAction getC() {

        return c;
    }

    public void setC(LoginAction c) {

        this.c = c;
    }

    public CloneTest clone() throws CloneNotSupportedException {

        return (CloneTest) super.clone();
    }

    public static void main(String args[]) throws CloneNotSupportedException {

        CloneTest p = new CloneTest();
        CloneTest p1 = p.clone();
        CloneTest p2 = new CloneTest();

        System.out.println(p == p1);
        System.out.println(p.getA() == p1.getA());
        System.out.println(p.getB() == p1.getB());
        System.out.println(p.getC() == p1.getC());
        System.out.println("===============================");
        p1.setB("xx");
        p.getC().setCos("cosA");
        p1.getC().setCos("cosB");
        System.out.println(p.getB() == p1.getB());
        System.out.println(p.getB() + ";;;;;;;;;;;;;" + p.getC().getCos());
        System.out.println(p1.getB() + ";;;;;;;;;;;;;" + p1.getC().getCos());
        System.out.println("===============================");
        System.out.println(p.getB());
        System.out.println(p.getB() == p2.getB());
        System.out.println(p.getC() == p2.getC());
    }

}


运行结果

false
true
true
true
===============================
false
sss;;;;;;;;;;;;;cosB
xx;;;;;;;;;;;;;cosB
===============================
sss
false
false




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章