【问题标题】:Object in ArrayList is changingArrayList 中的对象正在发生变化
【发布时间】:2014-10-14 01:57:23
【问题描述】:

我编写了一个测试程序,因为我在使用 PL/SQL 之后尝试重新回到 Java。我创建了一个包含整数、getter 和 setter 的类 Numbers。我有另一个类 Test 正在创建 Numbers 的实例,并将该实例添加到 List 中。我创建了一个循环两次并将 Numbers 中整数的值设置为 i 的 for 循环。然后我将该 Numbers 实例添加到 List numbersList。然后我打印添加到列表中的值的屏幕。我总共打印了 3 次,第一次通过循环打印列表中的第一个位置,然后我在第二次通过循环打印两次,再次在列表中的第一个位置,第二个位置在列表中。我期望得到 0,0,1 作为结果。结果我得到了 0,1,1,但我不知道为什么。在第二次循环期间,我没有更改列表中第一个位置(numbersList[0])的任何内容,我所做的只是将 Numbers 的一个实例添加到列表中的第二个位置(numbersList[1])。

import java.util.ArrayList;
import java.util.List;

public class Tests {
    static int x;

    public static void main(String[] args) {
        List<Numbers> numbersList = new ArrayList<Numbers>();
        Numbers numbers = new Numbers();
        Numbers numbers2 = new Numbers();
        for (int i = 0; i < 2; i++) {
            if (i == 0) {
                numbers.setVariable(i);
                numbersList.add(numbers);
                System.out.println(numbersList.get(0).getVariable());
            }

            if (i > 0) {
                numbers2.setVariable(i);
                numbersList.add(numbers2);
                System.out.println(numbersList.get(0).getVariable());
                System.out.println(numbersList.get(1).getVariable());
            }
        }
    }
}

public class Numbers {
    public static int a = 5;

    public static void setVariable(int b) {
        a = b;
    }

    public static int getVariable() {
        return a;
    }
}

【问题讨论】:

    标签: java arrays object arraylist


    【解决方案1】:

    public static int a = 5 表示由于static 关键字,Numbers 的所有实例共享同一个变量。

    因此,当您执行numbers2.setVariable(i); 时,变量也会更改为numbers。因此0,1,1

    如果您想要实例变量,请从 Numbers 中删除 static 关键字。

    【讨论】:

      【解决方案2】:

      您的类 Numbers 没有实例字段(一切都是 static,或类级别)。

      它应该看起来像(并且覆盖 toString() 是个好主意),

      public class Numbers {
         public int a = 5;
      
         public void setVariable(int b){
               a = b;
         }
         public int getVariable(){
              return a;
         }
         @Override
         public String toString() {
              return String.valueOf(a);
         }
      }
      

      通过覆盖toString(),您可以更轻松地打印Numbers 的实例。例如,

      System.out.println(numbersList);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-03
        • 1970-01-01
        • 2019-06-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 2023-03-24
        相关资源
        最近更新 更多