我的ArrayList被覆盖,我不清楚为什么?每次有新的“添加”。它将所有先前的条目更改为此

时间:2019-05-02 23:15:47

标签: java arrays eclipse class

我正在为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

2 个答案:

答案 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中。

通常来说,静态数据应该是例外而不是规则。创建类的单独实例的要点是它们实际上应该是分开的。