显示方法 - 输出错误

Display Method - Output Error

我开始学习了JAVA。我被要求创建一个跟踪新车和二手车的汽车程序。我应该创建一个名为 car 的超级 class,两个名为 UsedCar 和 NewCar 的派生 classes,以及一个测试这 3 个 classes 的 Driver class .

所有 classes 编译和 运行。然而。当我输出它时,我得到垃圾输出。我不明白我哪里出错了。我知道 Driver class 很好,还有超级 "Car" class。 UsedCar 和 NewCar classes 的某处导致输出错误。任何意见或建议都会有所帮助。

这是我的 driver class:

public class CarDriver
{

public static void main(String[] args)
{
  NewCar new1 = new NewCar(8000.33, "silver");
  NewCar new2 = new NewCar(8000.33, "silver");
  if (new1.equals(new2))
  {
    new1.display();
  }

  UsedCar used1 = new UsedCar(2500, 100000);
  UsedCar used2 = new UsedCar(2500, 100000);
  if (used1.equals(used2))
  {
    used1.display();
  }
} // end main
}//end class

这是我的车Class:

import java.util.*;


public class Car
{

//Variables

public Double price;


//Constructor

public Car(Double cost)//constructor to create instances of SavingsAccount
            {
                price = cost *2;
            }

//GetPrice method

public Double getPrice()//method to get the cars' price
            {
            return price;//returns the value of the price

        }


    }//end class Car

这里是派生的 classes:NewCar

import java.util.*;

public class NewCar extends Car
{

    //Variables
    public String color = "silver";

NewCar new1 = new NewCar(8000.33, "silver");
  NewCar new2 = new NewCar(8000.33, "silver");

    //Constructor - Two Parameter

    public NewCar (Double price, String color)//constructor to create instances of new car
                {
                    super(price);
                    color = this.color;

            }


    //Equals Method

    public boolean equals(Car NewCar)
    {
      if (NewCar == null)
      {
        return false;
      }
      else
      {
        return
          price.equals(new1.price) &&
          color.equals(new2.color);
      }
} // end equals

//Display method

public void display ()
{
    System.out.println(" " + new1.price + new1.color);
}//end display method

}//end class NewCar

二手车

import java.util.*;

public class UsedCar extends Car
{

//Variables

private double mileage;
public String color = "silver";

UsedCar used1 = new UsedCar(2500, 100000);
 UsedCar used2 = new UsedCar(2500, 100000);

//Constructor -Two Parameter

public UsedCar (double price, double mileage)//constructor to create instances of new car
                {
                    super(price);
                    mileage = this.mileage;

            }

  //Equals Method

 public boolean equals(Car UsedCar)
    {
      if (UsedCar == null)
      {
        return false;
      }
      else
      {
        return
          price.equals(used1.price) &&
          color.equals(used2.color);
      }
} // end equals

//Display method

public void display ()
{
    System.out.println(" " + used1.price + used1.mileage);
}//end display

}//end class

我无法粘贴我的输出,但它在命令行上看起来像这样并且它会不停地继续:

"at NewCar .(NewCar. java:11)"

您为每个创建的 NewCar 个实例创建 2 个额外的 NewCars

public class NewCar extends Car
{
// [...]

NewCar new1 = new NewCar(8000.33, "silver");
NewCar new2 = new NewCar(8000.33, "silver");

这些汽车尝试再制造 2 个 NewCar,这将尝试再制造 2 个 NewCar,依此类推。这只会在你达到一定水平之前有效(你得到 Whosebug)。如果您想避免异常,您需要删除 2 个字段 new1new2 的初始化。

您在 UsedCar 中也有类似的问题。

此外,如果您想覆盖 equals 方法,签名应该是public boolean equals(Object UsedCar) 而不是public boolean equals(Car UsedCar)

Tipp:@Override 注释添加到应该重写 superclass/interface 中方法的每个方法,编译器会告诉你,如果你签名错了。


您可能还想将 price 的类型从 Double 更改为 double。如果你知道你需要它,你应该只使用 Double 而不是 double。自动装箱和拆箱可能会降低您的性能。参见 Autoboxing and Unboxing

我可以立即看到 NewCar 的一些问题。

首先,您要使用代码

实例化(创建)两个 NewCars
NewCar new1 = new NewCar(8000.33, "silver");
NewCar new2 = new NewCar(8000.33, "silver");

在主例程中创建这些是正确的,正如您所做的那样。在 class 本身内创建两个新的本地实例可能是不正确的。

其次,你的 equals 语句说 equals(Car NewCar). 我的猜测是你想要 equals(Car otherCar). (请注意实例变量的小写作为 Java 约定。)

然后在你的 return 中你会说

return (otherCar.getPrice() == this.getPrice()) && (otherCar.color.equalsIgnoreCase(this.color);

尝试删除这些行

NewCar new1 = new NewCar(8000.33, "silver");
NewCar new2 = new NewCar(8000.33, "silver");

来自 NewCar class 和这些行

UsedCar used1 = new UsedCar(2500, 100000);
UsedCar used2 = new UsedCar(2500, 100000);

来自 UsedCar class。您正在 classes 本身内部创建那些 classes 的实例,我认为这不是您想要做的。

此外,您对 equals() 的实施也不正确。例如,在 NewCar 你有

public boolean equals(Car NewCar)

请注意您的变量名称实际上是您 class 的名称。相反,你想要

public boolean equals(Object obj)

此外,在比较变量之前,您应该测试被传递的对象是否是适当的 Car subclass 的实例。 UsedCarclass中的equals()也是如此。

在 class NewCar 和 UsedCar 中你做一个递归 class.

错误导致。

删除:

NewCar new1 = new NewCar(8000.33, "silver");
NewCar new2 = new NewCar(8000.33, "silver")

UsedCar used1 = new UsedCar(2500, 100000);
UsedCar used2 = new UsedCar(2500, 100000);

在你的构造函数中你使用了

color = this.color;

实际上你应该使用

this.color = color.

你在 equals 方法中实现的太不正确了。

正确:

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (!super.equals(obj))
        return false;
    if (getClass() != obj.getClass())
        return false;
    NewCar other = (NewCar) obj;
    if (color == null) {
        if (other.color != null)
            return false;
    } else if (!color.equals(other.color))
        return false;
    return true;
}

正确Class

Car.java

public class Car {

    private Double price;
    private String color;

    public Car(String color, Double cost) {
        this.color = color;
        this.price = cost * 2;
    }

    public Double getPrice() {
        return price;
    }

    public String getColor() {
        return color;
    }

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

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((color == null) ? 0 : color.hashCode());
        result = prime * result + ((price == null) ? 0 : price.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Car other = (Car) obj;
        if (color == null) {
            if (other.color != null)
                return false;
        } else if (!color.equals(other.color))
            return false;
        if (price == null) {
            if (other.price != null)
                return false;
        } else if (!price.equals(other.price))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "Car: \nColor:" + color + "\nPrice: " + price;
    }

    public void display() {
        System.out.println(toString());
    }

}

新建Car.java

public class NewCar extends Car {

    private String color = "silver";

    public NewCar(String color, Double coast) {
        super(color, coast);
        this.color = color;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = super.hashCode();
        result = prime * result + ((color == null) ? 0 : color.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (!super.equals(obj))
            return false;
        if (getClass() != obj.getClass())
            return false;
        NewCar other = (NewCar) obj;
        if (color == null) {
            if (other.color != null)
                return false;
        } else if (!color.equals(other.color))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return super.toString() + "\nType: New\nMileage:0\n";
    }
}

二手Car.java

public class UsedCar extends Car {

    private double mileage;
    private String color = "silver";

    public UsedCar(String color, double price, double mileage) {
        super(color, price);
        this.mileage = mileage;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = super.hashCode();
        result = prime * result + ((color == null) ? 0 : color.hashCode());
        long temp;
        temp = Double.doubleToLongBits(mileage);
        result = prime * result + (int) (temp ^ (temp >>> 32));
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (!super.equals(obj))
            return false;
        if (getClass() != obj.getClass())
            return false;
        UsedCar other = (UsedCar) obj;
        if (color == null) {
            if (other.color != null)
                return false;
        } else if (!color.equals(other.color))
            return false;
        if (Double.doubleToLongBits(mileage) != Double.doubleToLongBits(other.mileage))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return super.toString() + "\nType: Used\nMileage: " + mileage + "\n";
    }

}

CarDriver.java

public class CarDriver {

    public static void main(String[] args) {
        Car new1 = new NewCar("silver", 8000.33);
        Car new2 = new NewCar("silver", 8000.33);
        if (new1.equals(new2)) {
            new1.display();
        }

        Car used1 = new UsedCar("silver", 2500, 100000);
        Car used2 = new UsedCar("silver", 2500, 100000);
        if (used1.equals(used2)) {
            used1.display();
        }
    }
}