在 java 中完全覆盖克隆对象

Overriding cloned object completely in java

我正在将一个对象克隆到另一个对象中,然后尝试仅更改新对象中的两个参数。但原始对象仍在发生变化。我只希望两个副本应该分开。这是我的代码

Subgroup sg1 = new Subgroup();
sg1.setFname("Vali");
sg1.setMname("Sheik");
sg1.setLname("Sha");
Group g1 = new Group();
g1.setSg(sg1);
try { 
     Group g2 = (Group) g1.clone();
     Subgroup sg1 = g2.getSg();
     sg2.setFname("parvez");
     sg2.setMname("syed");
     sg2.setLname("khan");
     g2.setSg(sg2);
     System.out.println(g1);
     System.out.println(g2);
} catch (CloneNotSupportedException e) {  
     e.printStackTrace();
}

这两种情况都只打印第一个对象。

组中的克隆方法class

 Protected Object clone() throws CloneNotSupportedException {
     return super.clone();
 }

class中的clone()对象只做浅拷贝,你需要查看如何做deep cloning

通过覆盖克隆方法,您将创建对象的副本。

请看下面的例子:

Subgroup.java

public class Subgroup {

    private String fname;
    private String mname;
    private String lname;

    //getter-setter

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Subgroup sg = new Subgroup();
        sg.setFname(this.fname);
        sg.setMname(this.mname);
        sg.setLname(this.lname);
        return sg;
    }

     //to-string

}

Group.java

public class Group {

    private Subgroup sg;

    //getter-setter

    public Object clone() throws CloneNotSupportedException {
        Group g = new Group();
        g.setSg((Subgroup) this.sg.clone());
        return g;
    }
    //to-string

}

TestMain.java

public class TestMain {

    public static void main(String[] args) {
        Subgroup sg1 = new Subgroup();
        sg1.setFname("Vali");
        sg1.setMname("Sheik");
        sg1.setLname("Sha");
        Group g1 = new Group();
        g1.setSg(sg1);
        try {
            Group g2 = (Group) g1.clone();
            Subgroup sg2 = g2.getSg();
            sg2.setFname("parvez");
            sg2.setMname("syed");
            sg2.setLname("khan");
            g2.setSg(sg2);
            System.out.println(g1);
            System.out.println(g2);
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}