Object.clone()为什么是protected的原因是什么?

9

可能是重复问题:
为什么Java.lang.Object类中的clone()方法是受保护的?

下面是我的测试代码,用于检查克隆方法的工作:

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());
 }
}

抛出编译错误:在 obj1.clone() 处,clone() 在 java.lang.Object 中的访问是受保护的。

  1. 我在这里做错了什么?
  2. 为什么 clone() 被保护起来了?

谢谢。

编辑及答案:好吧,最终我发现当我实现 Cloneable 接口并覆盖 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()方法为什么是protected的:我从Core Java这本书中发现了这个问题。

clone方法是Object类的一个受保护的方法,这意味着你的代码不能直接调用它。只有Employee类可以克隆Employee对象。

这种限制是有原因的。想一想Object类如何实现clone。它根本不知道这个对象的任何信息,所以它只能进行逐个字段的复制。如果对象中的所有数据字段都是数字或其他基本类型,那么复制字段就没问题了。

但是,如果对象包含对子对象的引用,那么复制字段只会给你另一个对子对象的引用,因此原始对象和克隆对象仍然共享某些信息。

希望这对其他人有所帮助。

1个回答

2

你需要在Test类中重写clone方法。

为什么它是protected的讨论可以在这里找到,尽管似乎没有共识。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接