java - Object.clone() protected 原因是什么

标签 java clone

<分区>

Possible Duplicate:
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() has protected access in java.lang.Object at obj1.clone()

  1. 我做错了什么?
  2. clone() 受到保护的原因是什么?

谢谢

与答案一起编辑:好吧,当我实现 Cloneable 接口(interface)并覆盖克隆方法时,我终于看到我的测试工具正在工作。它不适用于仅覆盖 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 的一个 protected 方法,这意味着您的代码不能简单地调用它。只有 Employee 类可以克隆 Employee 对象。

这种限制是有原因的。想一想 Object 类可以实现克隆的方式。它对对象一无所知,所以它只能逐字段复制。如果对象中的所有数据字段都是数字或其他基本类型,则复制字段即可。

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

希望对其他人有帮助

最佳答案

您应该覆盖测试类中的克隆方法。

讨论了为什么要保护它 here尽管似乎没有达成共识。

关于java - Object.clone() protected 原因是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7887698/

相关文章:

java - Spring 休息端点不返回主体

java - 将 java.util.Date 转换为 java.sql.Date 导致日期更改

java - 寻找正确的克隆方法

c++ - 在复制构造函数中使用 *this 作为 const 来克隆自身

java - 异常(exception)组织协助?

java - 如何使 Toast 中的 2 行文本彼此居中?

java - Android 设备监视器无法在 Ubuntu 中启动

git - 将 Git 子模块设置为浅克隆和稀疏 checkout ?

jQuery clone() FireFox 错误 - 无法提交克隆表单

java - 在 java 中初始化类时,创建 Collection 到 ImmutableSortedSet 的深拷贝