在void方法中改变变量?

时间:2014-09-06 18:30:54

标签: java variables static void

我确信这看起来过于简单,但我对java来说是全新的。对于类我需要设置温度等级,并且需要在void方法中改变度。如何在void方法中访问这些变量,并确保void方法将参数更改为我需要的变量? 我需要转换学位,而且我不知道如何访问不在set类中的学位变量?

Temperature (double enteredtemp,char scale ){
   degrees=Temperature.set();


}
public void set (double enteredtemp, char scale){
       if (scale=='r'||scale=='R'){ degrees=(enteredtemp/(9/5));}
       else if (scale=='c'|| scale=='C') {degrees=enteredtemp+273.15;}
       else if (scale=='F'||scale=='f'){degrees=((enteredtemp+459.67)*9/5);}

4 个答案:

答案 0 :(得分:0)

我认为您发布的代码段位于一个具有“度”成员的类中。在那种情况下,你走在正确的轨道上。

例如:

public class Temperature {
    private double degrees;
    public Temperature (double enteredtemp,char scale ) {
        degrees=Temperature.set(enteredtemp, scale);
    }

    public void set (double enteredtemp, char scale) {
        if (scale=='r'||scale=='R'){ degrees=(enteredtemp/(9/5));}
        else if (scale=='c'|| scale=='C') {degrees=enteredtemp+273.15;}
        else if (scale=='F'||scale=='f'){degrees=((enteredtemp+459.67)*9/5);
    }

    public double getDegrees() {
        return degrees;
    }   
}

这是一个功能正常的类,除了我没有检查的转换和关于方法名称的一些编码约定我们可以讨论:)

只是为了确保你理解如何使用这个类,例如在main方法中:

Temperature t = new Temperature(25,'c');
System.out.println("Temperature F " + t.getDegrees());
t.set(30,'c');
System.out.println("Temperature F " + t.getDegrees());

答案 1 :(得分:0)

在方法中,Java中的变量是块作用域的,这意味着您需要将对象的引用传递给您的set方法(并在方法中更改对象的值),要么需要它来返回一些东西(这不是似乎是你想要的,因为你指定你想要它无效。

请解释为什么您希望set方法返回无效。看来你在其中进行了一些计算,我认为它更适合作为computecalculate方法,因为set方法(也称为setters)具有非常具体的含义。 Java以及许多其他编程语言(特别是OOP)。

可能是这样的:

public double computeDegrees(double enteredtemp, char scale) {
        double degrees = 0;
        if (scale=='r'||scale=='R'){ degrees=(enteredtemp/(9/5));}
        else if (scale=='c'|| scale=='C') {degrees=enteredtemp+273.15;}
        else if (scale=='F'||scale=='f'){degrees=((enteredtemp+459.67)*9/5);
        return degrees;
    }

another thread上找到您的代码,这是固定版本。如果您有任何问题,请尝试理解并在评论中提问。我认为您犯的最大错误是尝试在Temperature类的构造函数中实例化一个Temperature对象(最终创建堆栈溢出^^)。当你进入一个方法(可以说是一个构造函数是一个方法)时,使用关键字 this 来引用调用该方法的对象(在构造函数中,这个指的是对象是实例化)。

public class Temperature {

    public double degrees;

    public static void main(String[] args) {
        // This is an example
        Temperature myTemperature = new Temperature(28, 'C');
        System.out.println("My temperature is " + myTemperature.get());
        Temperature myOhterTemperature = new Temperature(25, 'C');
        boolean greaterThan = myTemperature.isGreaterThan(myOhterTemperature);
        System.out.println(greaterThan); // should be true since 28 > 25
    }


    Temperature () {
        degrees=0;
    }

    Temperature (double enteredtemp) {
        degrees = enteredtemp;
    }

    Temperature (double enteredtemp,char scale ) {
        set(enteredtemp,scale);
    }

    public void set (double enteredtemp, char scale){
        if (scale == 'r'|| scale == 'R'){ degrees = (enteredtemp/(9/5));}
        else if (scale == 'c'|| scale == 'C') {degrees = enteredtemp+273.15;}
        else if (scale =='F'|| scale == 'f'){degrees = ((enteredtemp+459.67)*9/5);}
    }

    public double get() {
        return degrees;
    }

    public double get(char scale) {
        if (scale == 'c'|| scale == 'C'){degrees = (degrees-273.15);}
        else if (scale == 'r'||scale == 'R'){degrees = (degrees*(9/5));}
        else if (scale == 'f'|| scale == 'F'){degrees = (degrees*(9/5)-459.67);}
        return degrees;
    }


    public boolean isLessThan(Temperature t) {
        if (this.get() < t.get()) {
            return true;
        } else {
            return false;
        }
    }

    public boolean isGreaterThan(Temperature t) {
        if (this.get() > t.get()) {
            return true;
        } else {
            return false;
        }
    }
    public boolean isEqual(Temperature t){
        if ((Math.abs(this.get() - t.get())) <= 10E-12) {
            return true;
        } else {
            return false;
        }
    }

    public boolean isGreaterThanOrEqual(Temperature t){
        if (this.get() >= t.get()){
            return true;
        } else {
            return false;
        }
    }

    public boolean isLessThanorEqual(Temperature t){
        if (this.get() <= t.get()) {
            return true;
        } else {
            return false;
        }
    }
}


编辑:刚刚注意到您的double get(char scale)方法实际上修改了调用该方法的Temperature实例的属性。这是非常糟糕的措辞选择,请重新阅读我上面关于mutators(getter和setter)的内容。 getter几乎不应该修改任何值,特别是不能调用getter的类的任何属性!如果我要使用这样的Temperature类,我当然希望返回的值是我的Temperature实例转换为给定比例的值的副本

this comment中也注意到你的教授讨厌切换,中断,并且不会让你使用案例。如果这个教授给你这个代码基础,请改变学校。

答案 2 :(得分:0)

好的做法是 - 除非有必要,否则不要使用静态方法或静态变量,或者你确定它是如何做的好方法。

在你的情况下,你可以这样做:

public class Temperature{
   private double temperature;

   public Temperature(double temperature){
      this.temperature = temperature;
   }

   public void addOneDegree(){
     temperature = temperature+1;
   }

   public double getTemperature(){
     return temperature;
   }
}

public class MyGreatProgramForTemperature{
    public static void main(String [] args){
      double testingTemp;
      Temperature temperature = new Temperature(50);
      testingTemp = temperature.getTemperature();
      System.out.println(testingTemp); //it prints 50
      temperature.addOneDegree();
      testingTemp = temperature.getTemperature();
      System.out.println(testingTemp); //it prints 51
    }
}

另请注意,您应该将每个班级都放在不同的文件中。

答案 3 :(得分:0)

您正在实施一个setter,其职责是更改度数值。 Setter通常具有无效返回值 - 这意味着他们根本不会返回任何内容。

您发布的此代码看起来像是“好的”&#39;设定器:

public void set (double enteredtemp, char scale){
       if (scale=='r'||scale=='R'){ degrees=(enteredtemp/(9/5));}
       else if (scale=='c'|| scale=='C') {degrees=enteredtemp+273.15;}
       else if (scale=='F'||scale=='f'){degrees=((enteredtemp+459.67)*9/5);}

但是,在构造函数中调用它的方式是完全错误的。这条线没有任何意义:

degrees=Temperature.set();

请记住,您的set函数返回void,因此尝试将该值赋给度数并不会起作用。此外,它完全忽略了调用setter的意义(即将set函数赋值给度)。另一个问题是你调用set()好像它是一个静态方法 - 它不是(如果它是,它将再次错过使用setter的点)。

从构造函数中调用set函数的正确方法是:

Temperature (double enteredtemp,char scale )
{
    set(enteredtemp, scale)
}

另一个例子......

Temperature temp = new Temperature(98.6, 'F');   // normal temp
temp.set(102, 'F');                              // now we've got a fever