从 java.lang.Object 访问 clone()
Posted
技术标签:
【中文标题】从 java.lang.Object 访问 clone()【英文标题】:Accessing clone() from java.lang.Object 【发布时间】:2011-07-02 19:52:42 【问题描述】:这是我无法理解的事情。
在java.lang.Object
中,clone()
使用protected
修饰符定义。根据定义,它可以在其自己的类定义中按名称访问,在派生自它的任何类中按名称访问,在同一包中的任何类定义中按名称访问。
这里Sample
类在另一个包中,显然它不能从Object
类访问clone()
。但是由于Sample
隐含地从Object
派生,为什么它无法访问它?定义并没有说它必须同时满足这两个条件(在同一个包内并且也是一个子类)。
public class Sample
public Object foo() throws CloneNotSupportedException
...
return someObject.clone();
【问题讨论】:
【参考方案1】:在您的情况下,clone()
方法不可见,因为您没有从子类中调用它。 Sample
派生自Object
,因此它可以访问自己的clone()
方法,但不能访问其他对象的方法。
对象clone()
的设计有几个错误。所以使用它不是一个好习惯——很难做到正确:
clone()
使其公开,它仍然会失败,因为每个类都必须实现Cloneable
但是,Cloneable
没有定义任何方法,因此对象的用户不能将其称为 Cloneable
并期望克隆方法。
层次结构中的每个类都必须调用 super.clone()
才能使默认克隆机制起作用
查看this question 以获取替代方案。
【讨论】:
【参考方案2】:为我工作:http://ideone.com/eST8Y
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 项)。
【讨论】:
【参考方案3】:someObject
的类类型在这里很重要。对象someObject
可能不会覆盖Object
类的clone()
方法,因此make 对于Sample
类是不可见的。
【讨论】:
【参考方案4】:“无法访问”是什么意思?你的意思是它不会编译还是抛出 CloneNotSupportedException。
如果你的类没有实现 Cloneable 接口,Object.clone()
将抛出 CloneNotSupportedException
。
【讨论】:
以上是关于从 java.lang.Object 访问 clone()的主要内容,如果未能解决你的问题,请参考以下文章
无法访问“org.gradle.api.artifacts.dsl.DependencyHandler”的超类型“java.lang.Object”
关于使用 C#(Xamarin 开发环境)从浮点矩阵转换为 Java.Lang.Object 的问题
为啥 java.lang.Object 中的 finalize() 方法是“受保护的”?