深拷贝似乎不起作用

时间:2014-04-23 04:14:27

标签: java oop deep-copy

我有两个班,一个班叫做客户,另一班叫班。类Department存储一组客户端。

我正在进行一些测试以证明Java中的Deep Copy,但它似乎不起作用。

在Department类中,我有一个get方法,它返回存储的客户端列表。例如:

public Client[] getClientList() {
        return clientList;
    } 

返回我存储的客户端数量的方法:

public int getNumberClients() {
        return n;
    }

和一个从clientList返回特定客户端的方法:

public Client getClient(int pos){
        return clientList[pos];
    }

在我的主程序中,我创建了一定数量的Clients并将它们存储到Department类中,特别是在clientList属性中;像这样的东西:

Client objCli1=new Cliente(...
...
Department objDep=new Department(100)
objDep.addClient(objCli1)
...

所以现在我想将Department类的数组从Department类返回到我的主程序中,并将它们的元素复制到另一个客户端数组中。像这样:

Client[] clientList;
int n=objDep.getNumberClients();
clientList=new Client[n];
for (int i=0;i<n;i++){
    clientList[i]=objDep.getClient(i);
}

因此,当我打印clientList的元素时,它们与我在Department类中的元素相同。问题是,如果我做这样的事情:

clientList[2].setName("Michaels")

它更改了我在Department类中存储的第二个客户端的名称;我想知道为什么会这样?因为我已将我在Department类中的元素的深层副本复制到主程序中的新clientList。那为什么不工作? 任何提示如何做到这一点都会很棒。

由于

2 个答案:

答案 0 :(得分:3)

在您的客户端类中创建克隆方法。喜欢这个

public Client clone(){
      Client client = new Client();
      client.name=name; 
      client.id=id;
      ...

      // copy each element property;

      return client;

 }

并在此处使用

Client[] clientList;
int n=objDep.getNumberClients();
clientList=new Client[n];
for (int i=0;i<n;i++){
   clientList[i]=objDep.getClient(i).clone();
}

答案 1 :(得分:2)

你没有对你刚引用它的对象进行深层复制,这就是为什么当你从第一个客户端更改名称时它也会改变你说你复制它的名称..

<强>解决方案:

在Client类中执行复制构造函数

public Client(Client client)
{
   this.name = client.getName();
}

在您的副本循环中

for (int i=0;i<n;i++){
    clientList[i]= new Client(objDep.getClient(i));
}