我正在测试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
的行为会有什么不同?
答案 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()
,则可以获得列表中每个对象的深层副本。