我正在向ArrayList添加元素,它正确地添加了第一个元素,但是当我添加任何后续元素时,它擦除了使用最近添加的值替换其他元素并向ArrayList添加新元素。
我使用arraylist和int运行测试,甚至是另一个创建的类,它运行得很好但是我在这里使用的自定义类会导致问题。
数组列表的代码是
public static void main(String args[]){
List<BasicEvent> list = new ArrayList<BasicEvent>();
list.add(new BasicEvent("Basic", "Door", 9, 4444, new Date(12,04,2010), new Time(12,04,21), 1, 0.98, 0));
list.add(new BasicEvent("Composite", "Door", 125, 4444, new Date(12,04,2010), new Time(12,04,20), 1, 0.98, 1));
list.add(new BasicEvent("Basic", "Door", 105, 88, new Date(12,04,2010), new Time(12,05,23), 1, 0.98, 0));
list.add(new BasicEvent("Basic", "Door", 125, 12, new Date(12,04,2010), new Time(12,05,28), 1, 0.98, 1));
list.add(new BasicEvent("Basic", "Door", 129, 25, new Date(12,04,2010), new Time(12,05,30), 1, 0.98, 0));
list.add(new BasicEvent("Basic", "Door", 125, 63, new Date(12,04,2010), new Time(12,04,20), 1, 0.98, 1));
list.add(new BasicEvent("Basic", "Detect", 127, 9, new Date(12,04,2010), new Time(12,05,29), 1, 0.98, -1));
for(int i=0;i<list.size();i++) {System.out.println("list a poition " + i + " is " + BasicEvent.basicToString(list.get(i)));}
自定义类basicEvent的代码是
public class BasicEvent {
public static String Level;
public static String EType;
public static double xPos;
public static double yPos;
public static Date date;
public static Time time;
public static double Rlb;
public static double Sig;
public static int Reserved;
public BasicEvent(String L, String E, double X, double Y, Date D, Time T, double R, double S, int Res){
Level = L;
EType = E;
xPos = X;
yPos = Y;
date = D;
time = T;
Rlb = R;
Sig = S;
Reserved = Res;
};
public static String basicToString(BasicEvent bse){
String out = bse.getLevel() + ";" + bse.getEtype() + ";" + bse.getxPos() + ";" + bse.getyPos() + ";" + bse.getDate().dateAsString() + ";" + bse.getTime().timeAsString() + ";" + bse.getRlb() + ";" + bse.getSig() + ";" + bse.getReserved();
return out;
}
答案 0 :(得分:14)
班级BasicEvent
的所有成员都是静态的,即他们在班级的所有实例之间共享。因此,在创建新实例时,旧实例的属性将被新值覆盖。
您应该将班级定义更改为
public class BasicEvent {
public String Level;
public String EType;
public double xPos;
public double yPos;
public Date date;
public Time time;
public double Rlb;
public double Sig;
public int Reserved;
...
}
作为旁注,一般来说,使用公共字段并不是一种好的做法 - 最好将它们设为私有,并仅在需要时提供公共访问者/设置者。当然,在实验代码中它并不重要,但在生产质量代码中它确实如此。
答案 1 :(得分:1)
为什么所有班级成员都是静态的?
静态意味着整个VM中只有一个值,因此在每次创建实例时都会覆盖这些值(这不是ArrayList的问题)。
使你的成员变量非静态,并考虑将它们设为私有并用getter公开它们。
答案 2 :(得分:0)
嗯,BasicEvent中的所有字段都是静态的,因此它们属于类,而不属于对象。这意味着它们对于所有对象都是相同的。每次创建对象时,都要在这些字段上书写。
请查看有关静态字段的含义以及如何使用它们的Java文档。