方法的返回值

时间:2013-03-15 04:23:01

标签: java class constants accessor mutators

我正在为我的作业编写一个程序,但对于我的defaultFan和toString方法,我收到一条错误,指出“无效的方法声明;需要返回类型。但是我不确定如何解决这个问题。我试着在前面放空这两种方法有效但后来我得到错误,说明我无法将变量分配给慢,中,快的最终变量。我不确定这是否正确。我该如何解决这个问题?

我也很难使用测试程序。我的教授希望我们使用一个创建2个粉丝对象的测试程序;第一个分配最大速度,半径10,颜色黄色和开启状态。第二个分配中速,半径5颜色蓝色和关闭状态,并通过调用它们的toString方法显示风扇对象。有人可以解释测试程序是如何工作的,以及我将如何为这个程序创建一个。这是我的代码:

public class fan {

  private final int slow = 1;
  private final int medium = 2;
  private final int fast = 3;
  private int speed;
  private boolean fanOn;
  private double radius;
  private String color;

  public void defaultFan( )
  {
  int speed = 1;
  boolean fanOn = false;
  double radius = 5;
  String color = "blue";
  }

  public fan(final int slow, final int medium, final int fast, int
speed, boolean fanOn, double radius, String color) {

  this.slow = slow;
  this.medium = medium;
  this.fast = fast;
  this.speed = speed;
  this.fanOn = fanOn;
  this.radius = radius;
  this.color = color;
  }

  public final int getSlow(){
    return slow;
  }

  public final int getMedium() {
    return medium;
  }

  public final int getFast() {
    return fast;
  }

  public int getSpeed() {
    return speed;
  }

  public boolean getfanOn() {
    return fanOn;
  }

  public double getradius() {
    return radius;
  }

  public String getcolor() {
    return color;
  }

  public void setSlow(final int slow) {
    this.slow = slow;
  }

  public void setMedium(final int medium) {
    this.medium = medium;
  }

  public void setFast(final int fast) {
    this.fast = fast;
  }

  public void setSpeed(int speed) {
    this.speed = speed;
  }

  public void setFanOn(boolean fanOn) {
    this.fanOn = fanOn;
  }

  public void setRadius(double radius) {
    this.radius = radius;
  }

  public void setColor(String color) {
    this.color = color;
  }

  public void toString() {
    if(fanOn = true ) {
  System.out.println("The speed of the fan is " + speed + ", the color
of the the fan is " + color + ", and the radius of the fan is " +
radius + ".");
}
  else {
    System.out.println("The fan is off but the color is " + color +"
and the radius is " + radius + ".");
  }

} }

4 个答案:

答案 0 :(得分:1)

  1. 变量slowmediumfast是最终的;你在他们的声明中设置了每一个,你不需要也不能重新初始化它们。您需要从构造函数中删除它们:

    public fan(int speed, boolean fanOn, double radius, String color) {
        this.speed = speed;
        this.fanOn = fanOn;
        this.radius = radius;
        this.color = color;
    }
    
  2. 现在,摆脱setSlowgetSlow方法,。保留其他人。

  3. 您可能希望使用以下代码调用构造函数:

    fan myFan = new fan(/* medium */ 2, true, 10.0, "blue");
    // But see 4 and 5 below.
    
  4. 变量slowmediumfastfan的任何特定实例无关。所以,你想要这样声明:

    public static final int SLOW = 1;
    public static final int MEDIUM = 2;
    public static final int FAST = 3;
    // The constructor call becomes:
    fan myFan = new fan(fan.MEDIUM, true, 10.0, "blue");
    
  5. 通常,Java中的类具有大写名称。打电话给班级Fan。将fan的所有实例替换为Fan

  6. toString方法不应该那么健谈。通常,人们编写这些方法来帮助他们调试代码,而不是提供对用户的友好访问。只需报告实例变量的值,这些值不包括SLOWMEDIUMFAST。不要使用条件逻辑。

  7. 您的toString方法实际上覆盖了Object中的基本方法。在你添加@Override注释之前,Java会唠叨你。为了好玩,请编写toString代码,使用它,然后注释掉代码。看看输出会发生什么。您将看到为什么需要覆盖Object中的方法。

    @Override
    public String toString() {
         return "Fan" + "[speed: " + speed +
                        ",on: " + fanOn +
                        ",radius: " + radius +
                        ",color: " + color + "]";
    }
    
  8. 对于将来的工作,请考虑使用Java自己的Color类而不是String。另外,考虑编写一个名为Speed的Java枚举,而不是使用这三个常量。

  9. 问问自己,如果一切顺利,如果出现问题或者错误地使用了类,那么使用代码的人会希望代码能够做什么。例如,Fan类可能遵守这些规则:

    • 如果我构建一个Fan,并且我要求它的速度,我会得到我的速度。
    • 同样关于它是否打开,它的半径和颜色。
    • 如果我选择Fan,并在其中一个实例变量上调用set方法,然后使用get方法查询变量,则获取我输入的值。
    • 如果我为其颜色构造一个半径为负Fannull的{​​{1}},则构造函数失败,抛出IllegalArgumentException。你的课程可能尚未涵盖。
    • 同样,如果我调用myFan.setRadius(-10.0),则set方法会抛出相同的异常,并且myFan保持不变。
    • 如果我尝试将Fan的速度设置为SLOWMEDIUMFAST以外的其他内容,则此操作也会失败。还记得关于枚举的建议吗?这是一个很好的理由。
  10. 有许多框架可以帮助进行软件测试;可悲的是,人们在实践中做得不够。但是查看JUnit;您的IDE几乎肯定有办法帮助您创建JUnit测试。

答案 1 :(得分:0)

public void toString()

这导致错误。在知情或不知情的情况下,您尝试override Object.toString()方法,这就是它显示错误的原因。您需要将toString()方法的返回类型更改为String或将方法名称更改为其他名称,以避免与Object.toString()发生冲突。

除了上面提到的主要问题之外,您的代码中还有一些其他错误,可以通过一个好的IDE解决。

答案 2 :(得分:0)

对于您的最后一个问题:有许多关于Java测试的教程。搜索JUnit。这是an example tutorial

答案 3 :(得分:0)

像这样编写你的toString方法

public String toString() {
    String description = "";
    if (fanOn = true) {
        description += "The speed of the fan is " + speed
                + ", the color  of the the fan is " + color
                + ", and the radius of the fan is " + radius + ".";
    } else {
        description += "The fan is off but the color is " + color
                + " and the radius is " + radius + ".";
    }
    return description;
}

我不确定你想用慢速/中速/快速做什么(似乎是速度冗余)。但是如果你想修改它,不要将它声明为最终版。

private int slow = 1;
private int medium = 2;
private int fast = 3;

您的测试程序需要一个构造函数。 (顺便说一下,你应该把你的班级命名为粉丝

public fan(int speed, double radius, String color, boolean fanOn ) {
    this.speed = speed;
    this.radius = radius;
    this.color = color;
    this.fanOn = fanOn;     
}

您的测试程序应如下所示。

public static void main(String args[]) {
    fan fan1 = new fan(100, 100, "red", true);
    fan fan2 = new fan(200, 200, "green", false);
}