Java 克隆方法的帮助

Java 克隆方法的帮助,java,Java,我几乎完成了这个项目,它涉及摄氏度、华氏度和开尔文之间的转换,我最不需要的是找出克隆方法。该任务是“克隆”,它不接受任何形式参数,并返回对新创建的温度对象的引用,该对象的值和比例与克隆对象的值和比例相同“。我的代码可以编译,但在客户端程序中运行时,我收到一个错误java.lang.StackOverflowerError at Temperature.clone(Temperature.java:134) 克隆方法是最后一种方法,因此任何帮助都将不胜感激。我不知道我哪里出错了!这是我第一次使用这

我几乎完成了这个项目,它涉及摄氏度、华氏度和开尔文之间的转换,我最不需要的是找出克隆方法。该任务是“克隆”,它不接受任何形式参数,并返回对新创建的温度对象的引用,该对象的值和比例与克隆对象的值和比例相同“。我的代码可以编译,但在客户端程序中运行时,我收到一个错误java.lang.StackOverflowerError at Temperature.clone(Temperature.java:134)


克隆方法是最后一种方法,因此任何帮助都将不胜感激。我不知道我哪里出错了!这是我第一次使用这个网站,所以很抱歉格式化

您意外地使
clone()
成为一个没有终止方法的递归方法


此外,将只返回一个浅拷贝。如果您试图返回深度副本,我建议您使用。

我不想给您家庭作业项目的答案,这是不赞成的。但是,克隆()方法的问题很难解决。。。含糊不清的

public Temperature clone()
方法头看起来很棒。您返回的是一个温度类型,可以公开访问

this.value = value;
this.scale = scale;
你知道“this”关键字的作用吗?它是指调用该方法的对象。因此,如果我有一个温度对象“a”,并且我想调用a.clone(),这将把a的值设置为等于。。。a的价值

return clone()
这部分说明了你的大问题。你到底在告诉java在这里做什么?您告诉它返回clone()方法返回的任何内容。这意味着克隆将调用它自己,它将再次调用它自己。。。对堆栈溢出。这是一个无法退出的递归循环


请记住,您希望clone()返回一个新的温度对象。

堆栈溢出的原因如下:

return clone();
你学过递归吗?此行正在从克隆方法内部调用克隆方法。。。这件事一次又一次地发生。。。好吧,直到堆栈耗尽空间

您希望返回一个新对象,而不是返回
clone()


这就是你所需要的。您编写的方法只是将调用对象的字段分配给它们自己,然后调用自身。最终,它会在堆栈中溢出对自身的调用,而没有真正执行任何操作。

您不需要对基本字段和不可变类型的字段执行任何操作(如
scale
)。因此,您在
clone()
中做得太多了。还需要调用super和Cloneable。

如果要使用
对象的方法,必须实现接口

根据文件

在未实现可克隆接口的实例上调用对象的clone方法会引发异常CloneNotSupportedException

但这样做不是一个好主意。最好从该对象创建一个新实例

StackOverflowerError的原因是,您正在重复调用
克隆
方法,该方法将永远不会返回

在许多情况下,
clone()
不是一条好路。显然,如果您的讲师需要它,您就必须编写它并包括
实现可克隆的

否则,编写副本构造函数通常更简单:

public Temperature(Temperature original) { ... }
它从一个旧的
Temperature
实例构建一个新的
Temperature
实例。这与克隆()的效果相同,但可以避免一些相关的问题


为了获得额外的学分,您是否已经完成了
enum
?如果是这样,那么您可能希望在此处使用
enum

此对象没有非基本字段和可变字段,因此常规克隆是合适的。Dilum是正确的,浅拷贝就足够了,因为值是基本字段,而scale是对不可变对象(字符串)的引用。无论如何,为True,复制构造函数不是创建新实例的正确方法,因为类不是final。你必须依靠super.clone。事实上,如果在非最终类中重写clone方法,则应返回通过调用super.clone获得的对象。这是家庭作业,因此我认为直接源代码复制粘贴答案不是实现这一点的理想方法。除非温度现在是且将永远是
最终
类,否则这是不正确的行为。假设我有一个UiTemperature类,它添加了与UI相关的行为。在UiTemperature实例上调用clone不应导致普通温度。True:如果在非最终类中重写clone方法,则应返回通过调用super.clone获得的对象。看一看,第45页,写得很好。给出了一些关于做错了什么的提示,一些关于如何在不泄露太多信息的情况下修复它的提示+1.
public Temperature clone()
{
    return new Temperature(this.value, this.scale);
}
public class Temperature implements Clonable // just this will work for your requirement
{
    // other code

    public Temperature clone() {
        return super.clone() //this will server your purpose of cloning your temperature object.
    }

}
public Temperature(Temperature original) { ... }