Object.clone()受保护的原因是什么

时间:2011-10-25 10:09:42

标签: java clone

  

可能重复:
  Why is the clone() method protected in 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中具有受保护的访问权限

  1. 我在这里做错了什么?
  2. clone()受保护的原因是什么?
  3. 由于

    编辑以及答案:最后,当我实现Cloneable接口并覆盖克隆方法时,我看到我的测试工具正在运行。它不能仅仅覆盖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()方法保护的原因:我从Core Java,

    一书中找到了这个

    clone方法是Object的受保护方法,这意味着您的代码不能简单地调用它。只有Employee类可以克隆Employee对象。

    这种限制是有原因的。想想Object类可以实现克隆的方式。它根本不了解对象,因此它只能进行逐场复制。如果对象中的所有数据字段都是数字或其他基本类型,则复制字段就可以了。

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

    希望这对其他人有帮助

1 个答案:

答案 0 :(得分:2)

您应该覆盖Test类中的clone方法。

为什么它受到保护会被讨论here,尽管似乎没有达成共识。