创建集合的克隆以各种方式的差异?调用clone()

时间:2015-05-06 14:42:19

标签: java collections clone

我正在测试clone()方法的行为。但是当我创建ArrayList的每个对象的克隆时,这显示编译时错误 -

  

Object类型的方法clone()不可见

我有两个问题 -

问题:1 - 这是由于克隆方法在Object class中受到保护。所以我们必须覆盖它(定义相同的signeture)或者我们在Language类中有两个重载它(非受保护的版本 - 因为它们位于不同的包中。)在Language类中定义clone是否必要?

我的CloneTesting.java文件代码是 -

package pack1;
import java.util.ArrayList;
class CloneTesting {  
  public static void main(String args[]) throws ClassNotFoundException{

      ArrayList<Language> list=new ArrayList<Language>();
      list.add(new Language("C","1"));
      list.add(new Language("JAVA","2"));
      list.add(new Language("C#","3"));
      list.add(new Language(".Net","4"));
      list.add(new Language("C++","5"));

      ArrayList<Language> list1=(ArrayList<Language>) list.clone();
      System.out.println(list==list1);

      ArrayList<Language> list2=new ArrayList<Language>();
      for(Language language:list){
          list2.add((Language) language.clone());
      }
      System.out.println(list==list2);
   } 
}

我的Language.java班级代码是 -

package pack2;
public class Language implements Cloneable{

    private String name;
    private String id;
    public Language(String name, String id){
        this.name=name;
        this.id=id;
    }

    public String getName() {
        return name;
    }

    public String getId() {
        return id;
    }
}

问题:2 - 克隆 - list1和克隆 - list2的行为会有什么不同?

1 个答案:

答案 0 :(得分:0)

  

问题:1-这是由于克隆方法在Object中受到保护   class.so我们必须覆盖它(定义相同的signeture)或我们有两个   在语言类中重载它(非受保护的版本 - 因为它们在   不同的包)。是否有必要在Language class中定义clone?

编译器抱怨,因为Language没有实现clone()。因此它使用clone()类中的Object方法。由于Object类位于不同的包中,因此编译器不允许您在clone()上调用Language。如果您覆盖clone()中的Language,则不会显示错误。

  

问题:2-克隆 - list1和。的行为会有什么不同   clone-list2?

如果是list1,您正在对列表进行浅层复制。因此,无法在列表中获取对象的深层复制。对于list-2,如果clone()未被覆盖,则完成每个元素的浅拷贝,如果覆盖clone(),则可以获得列表中每个对象的深层副本。