小编典典

这个clone()有什么问题?

java

我已经为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;
    }
}

阅读 224

收藏
2020-10-12

共1个答案

小编典典

您是否在对象上实现了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()

2020-10-12