从 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”

关于clone(java.lang.Object)重写

关于使用 C#(Xamarin 开发环境)从浮点矩阵转换为 Java.Lang.Object 的问题

为啥 java.lang.Object 中的 finalize() 方法是“受保护的”?

java.lang.Object 的受保护方法如何免受子类的影响?

java.lang.Object