帮助克隆方法

Ale*_*oss 4 java

我几乎完成了这个项目,涉及在Celsius,Fahrenheit和Kelvin之间转换,我最后需要的是找出克隆方法.任务是"clone,它不接受任何形式参数,并返回对新创建的Temperature对象的引用,该对象具有与其作为克隆的对象相同的值和比例".我的代码编译,但在客户端程序中运行时,我在Temperature.clone(Temperature.java:134)收到java.lang.StackOverflowError的错误

public class Temperature {
    private double value;
    private String scale;

    public Temperature() { // default constructor 
        this.value = 0;
        this.scale = "C";
    }

    public Temperature(double value, String scale) {
        this.value = value;
        this.scale = scale;
    }

    public double getValue() {
        return this.value;
    }

    public String getScale() {
        return this.scale;
    }

    public double getCelsius() {

        if (scale.equalsIgnoreCase("C")) {
            return this.value;
        } else if (scale.equalsIgnoreCase("F")) {
            double faren = ((this.value - 32) * (5 / 9));
            return faren;
        } else {
            double kelvin = (this.value - 273.15);
            return kelvin;
        }
    } // end getCelcius

    public double getFaren() {
        if (scale.equalsIgnoreCase("F")) {
            return this.value;
        } else if (scale.equalsIgnoreCase("C")) {
            double celsius = ((this.value * 1.8) + 32);
            return celsius;
        } else {
            double kelvin = ((this.value * 1.8) - 459.67);
            return kelvin;
        }
    } // ene getFaren

    public double getKelvin() {
        if (scale.equalsIgnoreCase("K")) {
            return this.value;
        } else if (scale.equalsIgnoreCase("C")) {
            double celsius = (this.value + 273.15);
            return celsius;
        } else {
            double faren = ((this.value + 459.67) * (5 / 9));
            return faren;
        }
    } // end getKelvin

    public void setTemperature(Temperature t) {
        this.value = t.value;
    }

    public void setType(double degree, String measure) {
        this.value = degree;
        this.scale = measure;
    }

    public void setValue(double degree) {
        this.value = degree;
    }

    public void setScale(String measure) {
        this.scale = measure;
    }

    public double convertToCelsius() {
        this.scale = "C";
        return this.value = getCelsius();
    }

    public double convertToFaren() {
        this.scale = "F";
        return this.value = getFaren();
    }

    public double convertToKelvin() {
        this.scale = "K";
        return this.value = getKelvin();
    }

    public Temperature clone() {
        this.value = value;
        this.scale = scale;
        return clone();
    }
}
Run Code Online (Sandbox Code Playgroud)

克隆方法是最后一种方法,所以任何帮助都会非常感激.我不确定我哪里出错了!这是我第一次使用这个网站,所以为格式化道歉!

Sam*_*aan 6

我不想给你一个家庭作业项目的答案,这是不赞成的.但是,你的clone()方法的问题很难......含糊不清.

public Temperature clone()
Run Code Online (Sandbox Code Playgroud)

方法标题看起来很棒.您正在返回温度类型,它可以公开访问.

this.value = value;
this.scale = scale;
Run Code Online (Sandbox Code Playgroud)

你知道'this'关键字的作用吗?它指的是调用该方法的对象.所以,如果我有一个温度对象'a'并且我想调用a.clone(),这将设置一个等于... a的值的值.

return clone()
Run Code Online (Sandbox Code Playgroud)

这是显示您的大问题的部分.你在实际上告诉java在这里做什么?你告诉它返回 clone()方法返回的任何内容.这意味着clone将调用自身,它将再次调用自身... on stack stack.这是一个无法退出的递归循环.

请记住,您希望clone()返回一个新的 Temperature对象.