问一个关于Object的clone()方法重新定义的问题

beingyourself 2008-02-20 08:31:50
我再学习对象克隆的时候,clone()方法被定义为protected的,不能直接调用anObject.clone(),但是有一个问题是就是所有子类都可以访问受保护的方法,不是每个类都是Object类的子类吗?书上的解释是子类只能调用受保护的clone()方法克隆他自己,为此必须重新定义clone()方法,并把他定义为public.
子类只能调用受保护的clone()方法克隆他自己,这个解释我还是听不明白,有没有更详细一点的解释啊,我都看了半天这个问题了,高手帮忙解决一个吧!!
...全文
277 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
beingyourself 2008-02-22
  • 打赏
  • 举报
回复
综合上面的说法,我现在理解的是:有类A和B,应为他们都是Object类的子类,所以他们都有一个在Object类中定义的默的protected的clone()方法。所以A中B的protected方法是不可见的,B中A的protected方法是不可见的,所以A中不可以new B().clone().在B中不可以new A().clone();我这样理解可以吗?
还有他们的protected方法对于他们同一个包和他们的子类是可见的,所以如果A,B同包或者他们互相为父子类那么就可以new A().clone();或者new B().clone();了吧。
dracularking 2008-02-21
  • 打赏
  • 举报
回复
那如果我设计两个类A,B,B是继承A的,在A中我用new B().clone();A B有子孙关系了,这样可以吗?
======================================================================================
可以 在遗传线路上
wuxo84 2008-02-21
  • 打赏
  • 举报
回复
关注~
magic256 2008-02-21
  • 打赏
  • 举报
回复
对于这个问题,建议你参考thinking in java第三版附录部分:对象的拷贝,看完后你会豁然开朗的~~~~
我这里先解释下:
一个类的受保护方法是可以被继承这个类的子类所使用的,子类也可以重写它,实现自己的特殊功能,但是反过来,父类是不可以看到子类的protected方法的
比如说
class A extends Object() {
  protected Object clone() {
    return new A();
  }
}
如果这里把protected改成public,那么在一个Object对象中才能(new A()).clone();
beingyourself 2008-02-21
  • 打赏
  • 举报
回复
子类的方法只能够访问子类对象的受保护字段或方法,也就是你继承过来的,而不能访问其他父类对象的这个字段或方法,也就是你下面创建了一个父类实例然后用父类实例去调这个方法.
beingyourself 2008-02-21
  • 打赏
  • 举报
回复
那如果我设计两个类A,B,B是继承A的,在A中我用new B().clone();A B有子孙关系了,这样可以吗?
dracularking 2008-02-20
  • 打赏
  • 举报
回复
Object中的clone方法是在java.lang包中的
而A默认是在default package中的
两者默认是不同包的
protected方法在他包且不具有子孙类关系的前提下(如A)是不可见的
beingyourself 2008-02-20
  • 打赏
  • 举报
回复
还是没有明白,为什么子类只能调用受保护的clone()方法复制自己呢,比如再A类中实现new B().clone();
treeroot 2008-02-20
  • 打赏
  • 举报
回复
clone() 方法定义在Object中,而且 protected 和 native(本地实现了)
这个方法存在的目的就是为了子类调用它

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

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

但是往往对象比较复杂,而且Object的clone方法相对更高效,所以一般都会调用。


其实只要改一下java API 就不会造成误解了
1. Object中的clone()方法名改为 clone0() //只是被调用的方法
2. clone方法加到Cloneable接口中

实现的时候就是

  public class A implements Cloneable{
public Object Clone(){
A me=(A)clone0(); //不存在同名方法,不用加super
...
return me;
}
}





dracularking 2008-02-20
  • 打赏
  • 举报
回复
简单地说 在A类中进行
new B().clone();

是不行的
假设即使A B同包 且B未覆盖clone方法
所以说 在没有多余操作的前提下
只能是子类调用受保护的clone方法克隆他自己
如在A类中
this.clone();


当然了 A B都是实现了cloneable接口的

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧