显示方法 - 输出错误
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 个额外的 NewCar
s
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 个字段 new1
和 new2
的初始化。
您在 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 的实例。 UsedCar
class中的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();
}
}
}
我开始学习了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 个额外的 NewCar
s
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 个字段 new1
和 new2
的初始化。
您在 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 的一些问题。
首先,您要使用代码
实例化(创建)两个 NewCarsNewCar 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 的实例。 UsedCar
class中的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();
}
}
}