日期:2014-05-20  浏览次数:20671 次

问一个关于Object的clone()方法重新定义的问题
我再学习对象克隆的时候,clone()方法被定义为protected的,不能直接调用anObject.clone(),但是有一个问题是就是所有子类都可以访问受保护的方法,不是每个类都是Object类的子类吗?书上的解释是子类只能调用受保护的clone()方法克隆他自己,为此必须重新定义clone()方法,并把他定义为public.
  子类只能调用受保护的clone()方法克隆他自己,这个解释我还是听不明白,有没有更详细一点的解释啊,我都看了半天这个问题了,高手帮忙解决一个吧!!

------解决方案--------------------
简单地说 在A类中进行
Java code
new B().clone();

------解决方案--------------------
clone() 方法定义在Object中,而且 protected 和 native(本地实现了)
这个方法存在的目的就是为了子类调用它

要实现克隆必须实现Cloneable接口,但是Cloneable接口中没有定义该方法,这导致java实现克隆有点怪。
应该是API设计的一个不合理

因为Object的clone是一个本地方法,而且克隆时一般先调用它,其实也可以不调用它,自己实现
eg:
Java code
 public class A implments Cloneable{
       public Object clone(){
          return new A(); //不调用super.clone()
       }
   }

------解决方案--------------------
对于这个问题,建议你参考thinking in java第三版附录部分:对象的拷贝,看完后你会豁然开朗的~~~~
我这里先解释下:
一个类的受保护方法是可以被继承这个类的子类所使用的,子类也可以重写它,实现自己的特殊功能,但是反过来,父类是不可以看到子类的protected方法的
比如说
class A extends Object() {
  protected Object clone() {
    return new A();
  }
}
如果这里把protected改成public,那么在一个Object对象中才能(new A()).clone();

------解决方案--------------------
那如果我设计两个类A,B,B是继承A的,在A中我用new B().clone();A B有子孙关系了,这样可以吗? 
======================================================================================
可以 在遗传线路上