Java新手汽车应用程序

Java新手汽车应用程序,java,Java,我是一名学生,是的,这是我的家庭作业。我花了上周的时间复习笔记,阅读这本书,并在网上研究相关话题,但我不知道问题出在哪里。你能告诉我我做错了什么吗?任何帮助都将不胜感激。我只使用记事本和命令提示符 我得到的指导原则是:创建一个由两个类组成的Java应用程序。第一班将是你的申请班。二班是一个叫汽车的班。您的应用程序将创建一个名为nova的Car实例,并驱动它 汽车规则: 如果未启动车辆,则无法驾驶车辆。请向控制台发送错误消息。 如果车辆未启动,则无法停车。请向控制台发送错误消息。 如果汽车已经启动

我是一名学生,是的,这是我的家庭作业。我花了上周的时间复习笔记,阅读这本书,并在网上研究相关话题,但我不知道问题出在哪里。你能告诉我我做错了什么吗?任何帮助都将不胜感激。我只使用记事本和命令提示符

我得到的指导原则是:创建一个由两个类组成的Java应用程序。第一班将是你的申请班。二班是一个叫汽车的班。您的应用程序将创建一个名为nova的Car实例,并驱动它

汽车规则:

如果未启动车辆,则无法驾驶车辆。请向控制台发送错误消息。 如果车辆未启动,则无法停车。请向控制台发送错误消息。 如果汽车已经启动,则无法启动。请向控制台发送错误消息。 一旦你告诉汽车驾驶,你唯一能做的就是停止,并向控制台发送信息 一旦您呼叫停止,汽车将返回初始状态,用户必须在尝试执行任何其他功能之前启动汽车。向控制台发送消息 showState方法的目的是提供一种检查汽车状态的方法。它应该构建一条消息,然后将其发送到控制台

我的代码:

public class MyAppAssignment3
{
   public static void main (String[] args)
   {
       System.out.println("Scenario 1");
       Car nova1 = new Car();
       nova1.start();
       nova1.showState();
       nova1.drive();
       nova1.stop();
       nova1.showState();
       System.out.println("");

       System.out.println("Scenario 2");
       Car nova2 = new Car();
       nova2.showState();
       nova2.drive();  //needs to send error message - can't drive a car that's not started
       nova2.stop();
       nova2.showState();
       System.out.println("");

       System.out.println("Scenario 3");
       Car nova3 = new Car();
       nova3.showState();
       nova3.start();
       nova3.showState();
       nova3.stop();   //needs to send error message - can't stop a car that's not driving
       nova3.showState();
       nova3.drive();
       nova3.stop();
   }
}

class Car
{
   private boolean isStarted;
   private boolean isDriving;
   private boolean isStopped;
   private String showState;

   public Car()
   {
       this.showState = showState;
   }

   public void start()
   {
       isStarted = true;
       isDriving = false;
       isStopped = false;
       System.out.println("The car is " + this.showState);
   }

   public void drive()
   {
       isStarted = false;
       isStopped = false;
       isDriving = true;
       System.out.println("The car is " + this.showState);
   }

   public void stop()
   {
       isStopped = true;
       isStarted = false;
       isDriving = false;
       System.out.println("The car is " + this.showState);
   }

   public String showState()
   {
       if (isStarted)
       {
           showState = "started";
       }
       else if(isDriving)
       {
           showState = "driving";
       }
       else if(isStopped)
       {
           showState = "stopped";
       }
       System.out.println("The car is " + this.showState);
       return showState;
   }
}
我的输出完全错误-值不正确:

Scenario 1
The car is null
The car is started
The car is started
The car is started
The car is stopped

Scenario 2
The car is null
The car is null
The car is null
The car is stopped

Scenario 3
The car is null
The car is null
The car is started
The car is started
The car is stopped
The car is stopped
The car is stopped

很抱歉,如果这个帖子都不可靠。我输入的很好,但是预览看起来很糟糕。

我建议的是,每辆车都有自己独特的id:

 class Car
{
   private boolean isStarted;
   private boolean isDriving;
   private boolean isStopped;
   private String showState;
   private int id;

   public Car(Integer id)
   {
       this.id = id;
   }
...

}
然后在你说打印输出的所有地方,也包括id:

System.out.println("The car id "+id+" is "+ this.showState);
然后创建一个如下所示的对象:

Car nova1 = new Car(1);

Car nova2 = new Car(2);

Car nova3 = new Car(3);

这不是解决办法,但它为解决办法铺平了道路。您将找到解决方案,您将感受到它的味道

,因为您刚刚创建了一个新实例。实际上,您从未为这些实例设置默认值

至少可以这样考虑:

public Car()
{
    isStopped = true;
}
这样,当你打电话给你的第一个nova1.start;你可以在允许它重新开始之前检查它是否为真

public void start()
{
    if(isStopped)
    {
        isStarted = true;       
        isDriving = false;       
        isStopped = false;   
        showState = "started";    
        System.out.println("The car is " + this.showState);
    }
}
举个例子。但是你可以很容易地用它来推断你的其他需求。我的观点主要是创建一个实例,但期望布尔值有一个值,而不需要指定。您可以在默认情况下或在构造函数中执行此操作

例如:

private boolean isStarted = false;

您必须在代码中翻译所要求的内容,正如您所看到的,它甚至非常接近实际需求-例如:

如果未启动车辆,则无法驾驶车辆。请向控制台发送错误消息

变成:

public void drive()
{

    if( this.isStarted == false ){

        System.out.println("You should start the car first!");

    }else{

        System.out.println("Car is running!");

    }

}

注意,你可以写!this.isStarted是isStarted==false的缩写。

这实际上并没有做任何事情

public Car()
{
    this.showState = showState;
}
基本上,它只是将相同的值重新分配给自身。我会切换到初始状态,可能是停止

我会使用enum作为我的汽车状态,而不是依赖布尔状态,这可能会变得混乱

public enum CarState {
    Stopped,
    Started,
    Driving
}
然后只需将其分配给单个状态变量

class Car
{
    private CarState state;

    public Car()
    {
       this.state= CarState.Stopped;
    }

    public void start()
    {
        if (state.equals(State.Stopped)) {
            state = CarState.Started;
            showState();
        } else {
            System.error.println("Car is not in a valid state to be started");
        }
    }

    public void drive()
    {
        if (state.equals(State.Started)) {
            state = CarState.Driving;
            showState();
        } else {
            System.error.println("Car is not in a valid state to be driven");
        }
    }

    public void stop()
    {
        if (state.equals(State.Driving)) {
            state = CarState.Stopped;
            showState();
        } else {
            System.error.println("Car is not in a valid state to be stopped");
        }
    }

    public String showState()
    {
        System.out.println("The car is " + state);
    }
}

您遇到的另一个问题是,更改状态时未调用showStatus,这不会将当前状态分配给showState变量……我已使用enum纠正了这一问题。请尝试在每个步骤中输出变量的值。逻辑流程中存在一些问题。例如,检查构造函数

public Car()
{
   System.out.println(showState);
   this.showState = showState;
}
没有任何showState值被传递给构造函数,其值也没有在函数内部初始化

此外,在每个函数启动、停止和驱动中,您需要编写:

  System.out.println("The car is " + this.showState());
而不是:

  System.out.println("The car is " + this.showState);

让我们保持简单,为什么在只需要两个变量时使用3个变量?如果我错了是正确的,但是如果一辆车没有启动,而你没有驾驶它,那么它就会停下来,对吗?看看我的班级:

public class car
{
private boolean isStarted;
private boolean isDriving;

public car()
{
    isStarted = false;
    isDriving = false;
    //Initial State
    showState();
}

public void start()
{
    if(!isStarted)
    {
        if(!isDriving)
            isStarted = true;
    }
    else
        System.err.println("You can\'t start a car which is already started"); //You can’t start a car if it is already started (send an error message to the console).
        showState();
}   

public void drive()
{
    if(isStarted)
        isDriving = true;
    else
        System.err.println("You can\'t drive a car which is not started");

    showState();
}

public void stop()
{
    if(isStarted)
    {
        isStarted = false;
        isDriving = false;
        // Once you call stop, the car will return to the initial state and the user must start the car before attempting to do any other functions. (Send a message to the console. (Below on ShowState)
    }
    else
        System.err.println("You can\'t stop a car which is not started"); // You can’t stop a car if it is not started (send an error message to the console).
    showState(); // Once you tell the car to drive, the only thing you can do is stop (Send a message to the console)
}

public void showState()
{
    if(isStarted && isDriving)
        System.out.println("It\'s Driving");
    if(!isStarted && !isDriving)
        System.out.println("It\'s Stopped");
    if(isStarted && !isDriving)
        System.out.println("It\'s Started");
}

}

我希望这有帮助。干杯

使用enum是个好主意。 这里是一个使用Enum的实现,Enum使用默认实现,自己的实现使用typesystem。 也没有任何条件,比如if或switch。 只是纯粹漂亮的Java代码

public class Car {
private enum State {
  OFF {
    void start(Car c) {
      System.out.println("Starting the car");
      c.state = State.STARTED;
    }
  }, 
  STARTED {
    void stop(Car c) {
      System.out.println("Stopping the car");
      c.state = State.OFF;
    }
    void drive(Car c) {
      System.out.println("Driving the car");
      c.state = State.DRIVING;
    }
  }, 
  DRIVING {
    void stop (Car c) {
      System.out.println("Stopping the car");
      c.state = State.OFF;
    }
  };

  void start(Car c) {
    System.err.println("Can't start");
  }

  void stop(Car c) {
    System.err.println("Can't stop");
  }

  void drive(Car c) {
    System.err.println("Can't drive");
  }
}
  private State state = State.OFF;

  public void start(){
    state.start(this);
  }

  public void stop(){
    state.stop(this);
  }
  public void drive() {
    state.drive(this);
  }

  public void showState(){
    System.out.println("The car is "+state);
  }
}

这成功了!谢谢你的帮助

public class MyAppAssignment3
{
    public static void main (String[] args)
    {
        System.out.println("Scenario 1");
        Car nova1 = new Car();
        nova1.start();
        nova1.showState();
        nova1.drive();
        nova1.stop();   
        nova1.showState(); 
        System.out.println("");

        System.out.println("Scenario 2");
        Car nova2 = new Car();
        nova2.showState();
        nova2.drive();
        nova2.stop();
        nova2.showState();
        System.out.println("");

        System.out.println("Scenario 3");
        Car nova3 = new Car();
        nova3.showState();
        nova3.start();
        nova3.showState();
        nova3.stop();
        nova3.showState();
        nova3.drive();
        nova3.stop();
    }
}

class Car
{
    private boolean isStarted;
    private boolean isDriving;
    private boolean isStopped;
    private String showState;

    public Car()
    {
        isStarted = false;
        isDriving = false;
        isStopped = true;
    }

    public void start()
    {
        if(isStarted == false)
        {
            isStopped = false;
            isStarted = true;
            showState();
        }
        else
        {
            System.out.println("You can't start a car which is already started.");
        }

    }

    public void drive()
    {
        if(isStarted)
        {
            isDriving = true;
            showState();
        }
        else
        {
            System.out.println("You can't drive a car which is not started.");
        }

    }

    public void stop()
    {
        if(isStarted)
        {
            isStarted = false;
            isDriving = false;
            isStopped = true;
            showState();
        }
        else
        {
            System.out.println("You can't stop a car which is not started.");
        }

    }

    public String showState()
    {
        if(isStarted && (isDriving == false))
        {
            showState = "started";
        }
        else if(isStarted && isDriving)
        {
            showState = "driving";
        }
        else if(isStopped)
        {
            showState = "stopped";
        }
        System.out.println("The car is " + this.showState + ".");
        return showState;
    }

}

非常感谢。花了一段时间,但我从你的回复中拼凑出了一些有用的东西。非常感谢!别忘了说答案是正确的。这会增加你的声望,也会增加你的回答者。这是一个很好的方式为网站,以确定您的问题,以及解决