【问题标题】:Java- Accesing instances of a class in a methodJava-在方法中访问类的实例
【发布时间】:2014-09-06 16:57:23
【问题描述】:

我必须为接收温度值的类编写代码,将其转换为开尔文,然后确定它是否大于、等于、小于或其他输入的温度。对于每个布尔可能性,它必须说真或假。我无法将设置为 t1 的温度与布尔方法作为参数的温度 t 进行比较?有什么建议么?另外,不要对我投反对票,我知道我不知道我在做什么,这就是我问这个问题的原因。我上周开始学习Java,我知道我不擅长吗?

public class Temperature {

   public double degrees;
    public static void main(String[] args) {

}


    Temperature (){
   degrees=0;
}

Temperature (double enteredtemp){
    degrees = enteredtemp;
}
Temperature (double enteredtemp,char scale ){
   Temperature t1 = new Temperature (enteredtemp, scale);
   t1.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 (t.get() < t1.get())
 return true;
 else {
 return false;
 }

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

 }

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

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

【问题讨论】:

  • 请查看my answer here 是否也回答了此线程提出的问题(以防我建议我们将其作为重复项关闭)。

标签: java methods instance


【解决方案1】:

在这个表单的函数中

public boolean isGreaterThan(Temperature t){
  if (t.get()>t1.get()) {return true;}
  else {return false;}
}

您将t 与不存在的t1 进行比较。您希望将当前对象 (this) 与您传递的参数 t 进行比较。

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

还请注意,在您的构造函数中使用两个参数,您根本没有设置对象属性:您正在创建一个新的t1,设置它的属性,然后丢弃它。请致电this.set 而不是t1.set

【讨论】:

  • 我不明白这个方法是做什么的?这是针对类的,并且有一个测试程序会使用构造方法,然后通过布尔值测试的t与this进行比较?
  • 如果您已经有一个名为t1Temperature 和另一个名为t2,您可以调用t1.isGreaterThan(t2) 来比较两者。但这没有意义,除非您已经有了这些实例来进行比较。
  • 这就像问某人:“你比戴夫高吗?”为了使问题有意义,您需要有人向(“您”)提出问题,并与其他人(“戴夫”)进行比较。
【解决方案2】:

先编译

您发布的代码无法编译,因为您在这里使用了 t1 等未知变量:

public boolean isGreaterThan(Temperature t){
     if (t.get()>t1.get()) {return true;}
     else {return false;}
 }

你想把t1.放在那里。

不要更改get

使用名为get 的方法更改类的字段是违反直觉且不好的做法。所以不要这样:

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

我还删除了不必要的括号。

简化

此外,您的大多数方法都可以大大简化,例如:

public boolean isLessThan(Temperature t) {
    return get() < t.get();
}

public boolean isGreaterThan(Temperature t) {
    return get() > t.get();
}

public boolean isEqual(Temperature t) {
    return Math.abs(t.get() - get()) <= 10E-12;
}

public boolean isGreaterThanOrEqual(Temperature t) {
    return get() >= t.get();
}

public boolean isLessThanOrEqual(Temperature t) {
    return get() <= t.get();
}

改进

(我知道你称赞你的教授“不喜欢”switch(他错了),但还是把这个留给你参考。)

我还建议像这样重写set

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

【讨论】:

  • 我不能那样重写它,即使它的类更简单,并且我们被指示以某种方式编写 set 方法。 Prof 讨厌 swtich、break 和不让我们用例。我很好奇如何确保正确返回学位。如果我使用 get 方法,它会自动通过 set 方法找到度数?
  • 很好。我添加了其他改进,请参阅我的更新答案。
猜你喜欢
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 2017-05-12
  • 2013-09-08
  • 2014-01-26
  • 2014-01-09
相关资源
最近更新 更多