有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java错误地设置了arraylist

我想问一个关于arraylist的问题。在我的程序中,我定义了一个arraylist和一个用户定义的对象。问题是,当我想向这个arraylist添加一个对象时,它会添加一个对象,但下次我给用户对象赋予不同的值时,它会将我之前添加的旧对象的值设置为新对象。我的意思是,例如,我的旧对象中有13个,而新对象是14,这使旧对象变成了14。我找不到解决办法。我正在做一个绘图程序。我发布了部分代码

     public class Tester extends JPanel implements MouseMotionListener, MouseListener {

ArrayList<Lines> array = new ArrayList<Lines>();
    Lines l1;
      ...
    public Tester(){
    l1 = new Lines();
    l1.point1 = new Point();
    l1.point2 = new Point();
    l1.denklem = new int[3];

这就是我如何将对象添加到arraylist中

         else if(lineci == true){
        if(mouseclicks == 0){
            l1.point1.x = e.getX();
            l1.point1.y = e.getY();
            statusBar.setText( String.format( "Clicked at [%d, %d]", 
                    e.getX(), e.getY() ) );
            mouseclicks++;
            starter = false;
        }
        else if(mouseclicks == 1){
            l1.point2.x = e.getX();
            l1.point2.y = e.getY();
            statusBar.setText( String.format( "Clicked at [%d, %d]", 
                    e.getX(), e.getY() ) );
            mouseclicks = 0;
            int a = l1.point2.y - l1.point1.y;
            int b = l1.point1.x - l1.point2.x;
            int c = (l1.point2.x * l1.point1.y) - (l1.point1.x * l1.point2.y);
            l1.denklem[0] = a;
            l1.denklem[1] = b;
            l1.denklem[2] = c;

            array.add(l1);
        //  array3.add(l1);
            repaint();
        }

    }

当我点击鼠标时,如果lineci为真,它会根据点绘制一条线。当我打印arraylist的元素时,我总是得到最后一行。如果我画10条线,arraylist的10个元素是相同的。它从不在arraylist中保留旧值。顺便说一句,布尔启动并不重要。我只是忘了把它取下来


共 (4) 个答案

  1. # 1 楼答案

    我认为您的l1引用仍然指向添加到arrayList的前一个对象,您应该在将该对象添加到arrayList后立即覆盖该引用

    或者

     l1 = new Lines(); 
    

    或者

    l1 = null;
    
  2. # 2 楼答案

    您正在引用原始l1对象,因此它将修改原始l1对象——无论它是否在列表中

    如果要创建新对象,请创建新对象

  3. # 3 楼答案

    只需将同一对象反复添加到列表中即可。列表中的每一项添加都只是向同一个对象添加一个引用:l1。因此,当您更新l1的状态时,旧的“对象”似乎也发生了变化

    要纠正这一点,您需要为希望执行的每个添加创建一个新的Lines实例

  4. # 4 楼答案

    如果您想保持所有值(只有一个值)不变,并且类是可关闭的,或者创建一个新对象(更适合您的情况),请在更改内部值之前使用l1.clone()