java - 在java中完全覆盖克隆对象

标签 java clone

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

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

最佳答案

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

请参阅以下示例:

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

关于java - 在java中完全覆盖克隆对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39695134/

相关文章:

git 将子模块添加到现有目录

java - 有什么关于加速克隆 HashMap 的 Java 代码的建议吗?

java - 使用泛型而不是可克隆的原型(prototype)模式

java - Google Drive Java 快速入门指南警告

java - 如果已经扩展了其他内容,有什么方法可以扩展 Activity?

java - 无法在 Eclipse 中使用 gradle 运行 cucumber 功能文件。我收到 "Error: Could not find or load main class cucumber.api.cli.Main"错误

java - 使用 Java 中的 Eclipse 进行 Droid 编程

java - Vert.x 与同步事务

javascript - 使用 javascript 克隆 div 的子级

mercurial - 将本地 mercurial 存储库推送到远程服务器或从本地克隆到服务器