可能重复:
为什么clone((方法在java.lang.Object中受到保护?
这是我检查克隆方法工作的测试代码,
class Test{
int a;
public void setA(int value){
a = value;
}
public int getA(){
return a;
}
}
class TestClass{
public static void main(String args[]){
Test obj1 = new Test();
obj1.setA(100);
Test obj2 = obj1.clone();
System.out.println("obj1 A:"+obj1.getA()+" obj2 A:"+obj2.getA());
obj2.setA(9999);
System.out.println("obj1 A:"+obj1.getA()+" obj2 A:"+obj2.getA());
}
}
抛出编译错误:clone((在obj1.clone(((的java.lang.Object中具有受保护的访问权限
- 我在这里做错了什么
- clone((受到保护的原因是什么
感谢
编辑并回答:当我实现可克隆接口并覆盖克隆方法时,我终于看到我的测试工具正在工作。它不能只覆盖Object类中的clone((方法。这是修改后的代码,
class Test implements Cloneable{
int a;
public void setA(int value){
a = value;
}
public int getA(){
return a;
}
@Override
protected Test clone() throws CloneNotSupportedException{
return(Test) super.clone();
}
}
class TestClass{
public static void main(String args[]){
Test obj1 = new Test();
obj1.setA(100);
try{
Test obj2 = (Test)obj1.clone();
System.out.println("obj1 A:"+obj1.getA()+" obj2 A:"+obj2.getA());
obj2.setA(9999);
System.out.println("obj1 A:"+obj1.getA()+" obj2 A:"+obj2.getA());
}catch(Exception e){
System.out.println("ERror"+e);
}
}
}
2.clone((方法被保护的原因:我在《核心Java,》一书中发现了这一点
clone方法是Object的受保护方法,这意味着您的代码不能简单地调用它。只有Employee类才能克隆Employees对象。
这一限制是有原因的。想想Object类实现clone的方式。它对对象一无所知,因此只能逐场复制。如果对象中的所有数据字段都是数字或其他基本类型,那么复制字段就可以了。
但是,如果对象包含对子对象的引用,则复制字段会为您提供对子对象的另一个引用,因此原始对象和克隆对象仍然共享一些信息。
希望这对其他有帮助
您应该覆盖Test类中的克隆方法。
这里讨论了它为什么受到保护,尽管似乎没有达成共识。