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




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