我有一个类 Client 理由 有4个属性  id name  分别都是StringBuffer 类型的
我先给他们赋值
                Client cl = new Client();
cl.setId(new StringBuffer("2"));
cl.setName(new StringBuffer("ddd"));
cl.setRe(new StringBuffer("1"));
cl.setTel(new StringBuffer("2"));
然后 我克隆出一个对象 放到 po 里
Client po = (Client) cl.clone();
用str 引用 po.getName();
StringBuffer str = po.getName();
然后给str 赋值
str.append("fff");
下面同理
Client po1 = (Client) cl.clone();
StringBuffer str1 = po1.getName();
str1.append("eee");
list.add(po);
if(str == str1){
System.out.println("=======");
}
for (MyBasicPojo f1 : list) {
System.out.println(((Client)f1).getName());
}
最后控制台 输出的是
=======
dddfffeee
dddfffeee我怎么也弄不明白 怎么样 才能 避免这种问题啊

解决方案 »

  1.   

    此方法会创建此对象的类的一个新实例,并像通过分配那样,严格使用此对象相应字段的内容初始化该对象的所有字段;这些字段的内容没有被自我克隆。所以,此方法执行的是该对象的“浅表复制”,而不“深层复制”操作。Javadoc里的原话。
      

  2.   

    你Client 没有进行深度的克隆。
    参考这个修改你的克隆属性方法
    public class A implements Cloneable {
    public String name[];   
        
        public A(){   
            name=new String[2];   
        }   
      
        public Object clone() {   
            A o = null;   
            try {   
                o = (A) super.clone();   
                o.name=(String[])name.clone();//
            } catch (CloneNotSupportedException e) {   
                e.printStackTrace();   
            }   
            return o;   
        }   
    }