这是我无法理解的事情。
在java.lang.Object
中,clone()
定义为protected
修饰符。根据定义,它可以通过名称在其自己的类定义中访问,通过名称在从它派生的任何类中,以及在同一包中任何类的定义中的名称。
此处Sample
类位于另一个包中,显然无法从clone()
类访问Object
。但是,Sample
隐式地从Object
派生,为什么它无法访问它?该定义并未说明它必须满足两个条件(在同一个包内,也是一个子类)。
public class Sample {
public Object foo() throws CloneNotSupportedException {
...
return someObject.clone();
}
}
答案 0 :(得分:9)
在您的情况下,clone()
方法不可见,因为您没有从子类中调用它。 Sample
来自Object
,因此它可以访问自己的clone()
方法,但不能访问其他对象。
对象clone()
设计有几个错误。所以使用它并不是一个好习惯 - 很难做到正确:
clone()
将其公开,则仍然会失败,因为每个类都必须实现Cloneable
Cloneable
没有定义任何方法,因此对象的用户不能将其称为Cloneable
并期望克隆方法。super.clone()
才能使默认克隆机制正常工作检查this question是否有替代方案。
答案 1 :(得分:3)
import java.util.*;
import java.lang.*;
class Main
{
public Object foo() throws CloneNotSupportedException
{
return this.clone();
}
public static void main (String[] args) throws java.lang.Exception
{
new Main().foo();
}
}
编译时没有错误。它仍会抛出运行时CloneNotSupportedException
,因为Main
未实现Cloneable
。
一个类实现
Cloneable
接口,以向Object.clone()
方法指示该方法合法地为该类的实例创建一个字段的副本。在未实现
Cloneable
接口的实例上调用Object的clone方法会导致抛出异常CloneNotSupportedException
。
@Bozho's answer确实是正确的答案。 请勿使用Object.clone()
。
请参阅Effective Java, Item 10: Override clone
judiciously(后续版本中的第11项)。
答案 2 :(得分:0)
此类someObject
的类类型很重要。对象someObject
可能不会覆盖clone()
类的Object
方法,因此对类Sample
不可见。
答案 3 :(得分:0)
你的意思是“无法访问它”?你的意思是它不会编译,或者你的意思是它抛出CloneNotSupportedException。
如果您的类没有实现Cloneable接口, Object.clone()
将抛出CloneNotSupportedException
。