我正在为uni创建一个有关注册汽车的程序。我有一个用于汽车的对象类和一个数组列表以将其全部保留,但是当使用我制造的addCar并尝试进行打印时,它将打印我输入的最后一辆,以显示应该有多少辆汽车。>
我尝试将代码直接放入主体中,并且尝试了各种不同的小更改,例如比较方式等。
这是我保存在Car类文件中的AddCar函数
public static ArrayList<Car> addCar(ArrayList<String> Makes, Integer CarCounter, ArrayList<Car> Cars) {
Integer Select;
boolean Equal = false;
for (int i = 0; i < Makes.size(); i++) {
System.out.println(i + ": " + Makes.get(i));
}
Scanner choice = new Scanner(System.in);
{
System.out.println("Enter Numeric Choice: ");
while (!choice.hasNextInt()) {
System.out.println("Error Please Enter Numeric Choice Again: ");
choice.next();
}
Select = choice.nextInt();
}
if (Select >= Makes.size()) {
System.out.println("No records exist (Number entered too large)");
} else {
for (int i = 0; i < Makes.size(); i++) {
if (Equal = Makes.get(i).equals(Makes.get(Select))) {
break;
}
}
if (Equal == true) {
Car newCar;
Make = Makes.get(Select);
Reg = Input.getString("What is the registration: ");
Model = Input.getString("What is the Model: ");
Colour = Input.getString("What is the Colour: ");
newCar = new Car();
newCar.setMake(Make);
newCar.setReg(Reg);
newCar.setModel(Model);
newCar.setColour(Colour);
Cars.add(CarCounter, newCar);
} else {
System.out.println("Make is unavailable Please Try Again");
}
}
return Cars;
}
这是在主文件主体中声明arraylist的行
ArrayList<Car> Cars = new ArrayList<Car>();
在我的切换案例菜单中,在其中一种情况下调用函数的行
Cars = Car.addCar(Makes, CarCounter, Cars);
例如,如果我将第一辆车设置为fiat,L4QWS,Punto,Silver
,第二辆车设置为Ferrari,4RE33,LaFerrari,Red
,则应该为:
Car 1:
Make: fiat
Registration: L4QWS
Model: Punto
Colour: Silver
Car 2:
Make: Ferrari
Registration: 4RE33
Model: LaFerrari
Colour: Red
但是,实际上是这样显示的:
Car 1:
Make: Ferrari
Registration: 4RE33
Model: LaFerrari
Colour: Red
Car 2:
Make: Ferrari
Registration: 4RE33
Model: LaFerrari
Colour: Red
答案 0 :(得分:0)
可能CarCounter
从未增加,因此,在调用Cars.add(CarCounter, newCar)
时,您始终会覆盖列表中的第一个(也是唯一一个)项目。您根本不需要CarCounter
,因为它对Cars.size()
来说是多余的。要将项目添加到列表中,只需使用Cars.add(newCar)
,它肯定会将其添加到列表的末尾。说到Integer
参数:您不是仅通过使用Integer
而不是int
来通过引用调用方法,出于性能方面的考虑,您应该首选原始类型int
。在极少数情况下,您确实希望传递Integer
对象。而且,如果您真的想通过引用传递整数,则可以将其封装到数组中,或者使用诸如AtomicInteger
之类的包装器类。
答案 1 :(得分:0)
问题在于Car类的数据成员被定义为static
。这意味着只有一个此类数据成员的副本,在Car类的所有实例之间共享。
因此,当您创建新的Car并设置其值时,它们会显示在所有Car中。
通常来说,静态数据应该是例外而不是规则。创建类的单独实例的要点是它们实际上应该是分开的。