首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >object.clone()在java中到底是如何工作的?

object.clone()在java中到底是如何工作的?
EN

Stack Overflow用户
提问于 2016-12-15 03:29:43
回答 1查看 81关注 0票数 4

我试图理解对象类的克隆()方法的工作原理。object类中的注释说‘此方法执行该对象的“浅拷贝”,而不是“深度复制”操作.

以下是我对浅部和深版的理解。

浅层尽可能少地复制副本。集合的浅副本是集合结构的副本,而不是元素的副本。对于浅拷贝,两个集合现在共享各个元素。 深度复制复制一切。一个集合的深层副本是两个集合,其原始集合中的所有元素都被复制。

因此,如果我克隆一个对象并修改它在克隆上的任何可变元素,那么同样的元素应该反映在创建克隆的第一个对象上,因为两者共享相同的内存。为了测试这个,我创建了3个类..。

一个简单的波乔..。

代码语言:javascript
复制
package test.clone;

import java.util.Arrays;

public class Misc implements Cloneable{
    private String value;

    public Misc(String value) {
        super();
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "Misc [value=" + value + "]";
    }


    protected Misc clone() throws CloneNotSupportedException{
        return (Misc)super.clone();
    }

}

类需要克隆的..。

代码语言:javascript
复制
package test.clone;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class Victim implements Cloneable{
    private String name = "Renjith";
    private String[] educationList = {"EDU_1", "EDU_2", "EDU_3", "EDU_4"};
    private Misc[] miscList = {new Misc("1"), new Misc("2")};
    private List<Misc> miscList2 = new ArrayList<Misc>(Arrays.asList(miscList));

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String[] getEducationList() {
        return educationList;
    }
    public void setEducationList(String[] educationList) {
        this.educationList = educationList;
    }

    protected Victim clone() throws CloneNotSupportedException{
        return (Victim)super.clone();
    }
    public Misc[] getMiscList() {
        return miscList;
    }
    public void setMiscList(Misc[] miscList) {
        this.miscList = miscList;
    }


    public List<Misc> getMiscList2() {
        return miscList2;
    }
    public void setMiscList2(List<Misc> miscList2) {
        this.miscList2 = miscList2;
    }
    @Override
    public String toString() {
        return "Victim [name=" + name + ", educationList="
                + Arrays.toString(educationList) + ", miscList="
                + Arrays.toString(miscList) + ", miscList2=" + miscList2 + "]";
    }



}

做克隆的主类..。和修改..。

代码语言:javascript
复制
public class Main {

    public static void main(String[] args) throws CloneNotSupportedException {
        Victim victim = new Victim();

        System.out.println(victim);

        Victim secondVictim = victim.clone();

        String[] educationList = {"EDU_1_mod", "EDU_2_mod", "EDU_3_mod", "EDU_4_mod"};
        Misc[] miscList = {new Misc("3"), new Misc("4")};
        List<Misc> miscList2 = new ArrayList<Misc>(Arrays.asList(miscList));

        secondVictim.setEducationList(educationList);
        secondVictim.setMiscList(miscList);
        secondVictim.setMiscList2(miscList2);

        System.out.println(secondVictim);

        System.out.println(victim);
    }

}

我希望得到如下的结果..。

受害者[name=Renjith,educationList=EDU_1,EDU_2,EDU_3,EDU_4,miscList=[Misc value=1,Misc value=2],miscList2=[Misc value=1,Misc value=2]]受害者[name=Renjith,educationList=EDU_1_mod,EDU_2_mod,EDU_3_mod,EDU_4_mod,[ Misc EDU_3_mod,Misc EDU_3_mod],miscList=[Misc EDU_3_mod,Misc EDU_3_mod],[Misc,Misc]受害者[,[Misc en30#,Misc en33#],miscList2=[Misc value=3,Misc value=4]

但我有..。

受害者[name=Renjith,educationList=EDU_1,EDU_2,EDU_3,EDU_4,miscList=[Misc value=1,Misc value=2],miscList2=[Misc value=1,Misc value=2]]受害者[name=Renjith,educationList=EDU_1_mod,EDU_2_mod,EDU_3_mod,EDU_4_mod,[ Misc EDU_3_mod,Misc EDU_3_mod],miscList=[Misc EDU_3_mod,Misc EDU_3_mod],[Misc,Misc]受害者[,[Misc en30#,Misc en33#],miscList2=[Misc value=1,Misc value=2]

有人能告诉我这是怎么回事吗?

我已经通过了Understanding Object.clone() in Java,但还是无法理解.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-15 03:39:45

您不是在修改列表/数组,而是用一个新的引用来替换它们。尝试像下面这样更新您的设置:

代码语言:javascript
复制
public void setMiscList(Misc[] miscList) {
    this.miscList[0] = miscList[0];
    this.miscList[1] = miscList[1];
}

public void setMiscList2(List<Misc> miscList2) {
    this.miscList2.set(0, miscList2.get(0));
    this.miscList2.set(1, miscList2.get(1));
}

这将修改共享对象,从而产生预期的输出。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41155969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档