当前位置: 首页 > 面试题库 >

这个clone()有什么问题?

戎俊
2023-03-14
问题内容

我已经为Employee类的父类是抽象的并且父类中的clone()方法是抽象的编写了此克隆方法。我想用此代码复制Employee对象的原始数据类型,而不是复制每个原始数据单独键入,但是此代码在我调用clone()方法的行中有问题。(此代码在Employee类中)

public Object clone() {
    Object obj = new Object();
    Object object = obj.clone();  //Emphasis here
    return object;

}

错误是:来自对象类型的方法clone()不可见。

但是我的Employee类在类层次结构中,可以访问Object类中受保护的clone()方法。

这是我简单的Employee类:

public class Employee extends Person implements Cloneable {
private int ID;

public Employee() {
    ID = 0;
}

public void setID(int ID) {
    this.ID = ID;
}

public int getID() {
    return ID;
}

public Object clone1() throws CloneNotSupportedException {
    try {
        Object obj = new Object();

        Object object = obj.clone();
        return object;
    } catch (CloneNotSupportedException ex) {
        return null;
    }
}

问题答案:

您是否在对象上实现了Cloneable接口?

但是,在极少数情况下,我会使用克隆来复制对象。这样的安全示例之一是array.clone()。我宁愿使用copy-
constructor惯用语,也可以手动复制/分配值。

在有效Java(第二版)中有关于后台问题的Item#11
。可Object克隆接口是一种特殊的接口,因为它修改了有关克隆的类的行为。基本上,这是启用Java中 接口的功能。

编辑: 根据您的示例,在一般情况下,您可能需要将clone()调用包装在CloneNotSupportedException的try-catch中。

Edit2: 改写我的答案

Edit3: 您是否在public上下文中覆盖了clone()?在您给的示例中,您尝试克隆一个对象,该对象位于java.lang包中-
几乎不包含您的代码所在的包。

Edit4: 我认为答案已经在其他帖子中,只是想对根本问题进行反思。

Edit5: 试试看:

public Object clone1() throws CloneNotSupportedException {        
    return super.clone();        
}

Edit6 然后命名您的方法public abstract Object copy(),例如,在实现中,使用super.clone()-避免造成混淆。

Edit7 我做了一些日食,并提出了以下解决方案

public class Cloner {
    public static abstract class Person {
       protected abstract Object clone1() throws CloneNotSupportedException;
       public Object copy() throws CloneNotSupportedException {
           return clone1();
       }
    }
    public static class Employee extends Person implements Cloneable {
        @Override
        protected Object clone1() throws CloneNotSupportedException {
            return super.clone();
        }

    }
    public static void main(String[] args) throws Exception {
        new Employee().copy();
    }
}

但是基本上,这与将抽象方法重命名为clone()之外的其他概念是相同的。

Edit8: 修复了我的示例,现在可以正常运行了。

(但实际要归功于 的Gabor Hargitaisuper.clone()



 类似资料:
  • 我有一个关于书库的问题...我想写一个有3个堆栈的程序,我想在每个堆栈上添加这些操作(我应该使用数组): 1.创建堆栈2。按3号。流行音乐4号。显示每个堆栈的顶部 我写的程序,但我遇到了这些错误: 错误4错误LNK2019:未解析的外部符号“public:int\u thiscall stack::IsFull2(void)”(?IsFull2@stack@@QAEHXZ)在函数“public:v

  • 我是GraphQL的新手,我正试图做一个突变来从我的数据库中删除一篇文章,但我不知道如何删除。我使用Node.js,猫鼬和GraphQL。 这是我的模式的变异。 这是我在调用API删除文章时使用的查询。 我做错了什么? 我收到一个错误的400请求。消息:“无法查询类型为“变异”的字段“删除”

  • 尝试在每周一8:15运行时间表,我尝试了以下表达式: 我想这意味着: 分钟数:15 小时:8 月日:每隔 月份:每 星期几:仅周一 年份:每 文件:http://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html

  • 提示:Extra content at the end of the document这样的错误

  • 问题内容: 谁能看到为什么此开关不起作用? 在此语句中,始终返回默认值,但是在对switch表达式进行硬编码时,switch块会按预期工作。查看ReadString()函数代码,它返回一个字符串,因此我看不到任何原因导致我的示例不起作用。 难道我做错了什么?! 问题答案: 您的文本包含两个字节:是2和是1。 您第二个符号是不可见的,您可以尝试使用将其删除。

  • 下面的代码返回一个错误,但我不确定原因。需要更改哪些内容以允许编译?