我已经为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中 类 接口的功能。
Object
编辑: 根据您的示例,在一般情况下,您可能需要将clone()调用包装在CloneNotSupportedException的try-catch中。
Edit2: 改写我的答案
Edit3: 您是否在public上下文中覆盖了clone()?在您给的示例中,您尝试克隆一个对象,该对象位于java.lang包中- 几乎不包含您的代码所在的包。
public
Edit4: 我认为答案已经在其他帖子中,只是想对根本问题进行反思。
Edit5: 试试看:
public Object clone1() throws CloneNotSupportedException { return super.clone(); }
Edit6 然后命名您的方法public abstract Object copy(),例如,在实现中,使用super.clone()-避免造成混淆。
public abstract Object copy()
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 Hargitai 为super.clone())
super.clone()