Java 我的ArrayList正在被覆盖,我不清楚为什么?每次都有一个新的;加上;它会将以前的所有条目更改为此
我正在为uni创建一个关于汽车注册的程序。我有一个用于汽车的对象类和一个数组列表来保存它们,但是当我制作的addCar被使用时,我尝试打印它,它将打印我输入的最后一个,以显示应该有多少辆汽车 我已经尝试将代码直接提升到主体中,它是相同的,我尝试了各种不同的小更改,比如我比较的方式等等 下面是我保存在Car类文件中的AddCar函数Java 我的ArrayList正在被覆盖,我不清楚为什么?每次都有一个新的;加上;它会将以前的所有条目更改为此,java,arrays,eclipse,class,Java,Arrays,Eclipse,Class,我正在为uni创建一个关于汽车注册的程序。我有一个用于汽车的对象类和一个数组列表来保存它们,但是当我制作的addCar被使用时,我尝试打印它,它将打印我输入的最后一个,以显示应该有多少辆汽车 我已经尝试将代码直接提升到主体中,它是相同的,我尝试了各种不同的小更改,比如我比较的方式等等 下面是我保存在Car类文件中的AddCar函数 public static ArrayList<Car> addCar(ArrayList<String> Makes, Integer Ca
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;
}
例如,如果我将第一辆车设置为菲亚特、L4QWS、普托、银色,将第二辆车设置为法拉利、4RE33、法拉利、红色,那么它应该是:
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
可能是
CarCounter
从不递增,因此在调用Cars.add(CarCounter,newCar)
时,您总是覆盖列表中的第一项(也是唯一一项)。您根本不需要CarCounter
,因为它对于Cars.size()
是多余的。要将项目添加到列表中,只需使用Cars.add(newCar)
即可将其添加到列表的末尾。说到Integer
参数:您不只是通过使用Integer
而不是int
来通过引用调用方法,出于性能原因,您应该更喜欢原语类型int
。在少数情况下,您确实希望传递一个Integer
对象。如果您真的想通过引用传递整数,可以将其封装到数组中,或者使用一些包装类,如AtomicInteger
,问题是Car类的数据成员被定义为static
。这意味着此类数据成员只有一个副本,在Car类的所有实例之间共享
因此,当您创建一辆新车并设置其值时,它们会显示在所有汽车中
一般来说,静态数据应该是例外而不是规则。创建单独的类实例的要点是,它们实际上应该是单独的。您的问题可能在Car类中。也许Car的所有成员数据都是静态的?@另一个Dave是的,我不确定静态和非静态的区别,我已经尝试过改变它,但是它变成了多米诺骨牌效应,从所有东西中移除静态,直到我在主控中调用该方法,它不喜欢它的静态意味着所有对象之间共享实例;所以你所有的车看起来都一样。这真的是问题吗?也许我应该把我的猜测提高到一个答案。静态值在类的所有实例之间共享,因为它们是独立于实例的。所以去掉静态声明。啊,是的,这听起来确实是个问题,任何地方都应该有静态的。很多函数和类都是静态的。是的,没有汽车计数器,这是我测试过的,当它打印出一个循环的汽车时,它打印的数字应该是正确的,例如,如果我尝试输入1,它将打印三辆汽车,如果我尝试输入2,它们将与最近输入的一辆相同。这是一个想法,但是,我调用addCar方法的问题现在是一个错误原因它正在对非静态方法进行静态引用,我不清楚如何使该引用成为非静态的步骤1:除了必须是静态的
main
之外,没有任何静态内容。步骤2,假设包含main
的类被称为CarRegister
,立即执行main
,并且只执行CarRegister foo=new CarRegister()然后是foo.someFunction()代码>。步骤3,现在您正在CarRegister的实例中执行。其他一切都应该引用一个实例。例如,您收集的汽车将是CarRegister实例的成员。
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