我已经为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 Hargitai 为super.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。 您第二个符号是不可见的,您可以尝试使用将其删除。
下面的代码返回一个错误,但我不确定原因。需要更改哪些内容以允许编译?