2016-09-26 42 views
0

我將一個對象克隆到另一個對象中,然後試圖只更改新對象中的兩個參數。但最初的對象仍然在變化。我只是希望兩個副本應該分開。這裏是我的代碼在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(); 
} 

這兩種情況它只打印第一個對象。在組類

克隆方法

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

請添加你的類的源代碼(組和子組) – 2016-09-26 05:19:11

+0

請顯示你的克隆方法 – Jens

+0

延斯,我已經更新 – Syed

回答

1

通過覆蓋克隆方法將創建的副本你目的。

請找到下面的例子:

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(); 
     } 
    } 
} 
+0

也請添加主要方法代碼 – Syed

+0

使用Main方法更新代碼。 –

1

Object類中的clone()不只是淺拷貝,而不是你需要檢查怎麼辦deep cloning

+0

你可以用樣本更新 – Syed

+0

您可以使用commons-lang SerializationUtils,組g2 =(Group)SerializationUtils.serialize(g1);但是所有的類都應該是可序列化的 – ravthiru