【问题标题】:ArrayList returns last item for all entries [duplicate]ArrayList返回所有条目的最后一项[重复]
【发布时间】:2013-03-05 13:04:16
【问题描述】:

我正在尝试使用要传递给 ArrayAdapter 的对象填充 ArrayList(最终)。我已经将一些代码提取到一个小型测试项目中来说明问题。

我有一个名为 Rules 的类,它有两个成员,Gender 和 Age (Rules.Java)。在 MyArrayTest 类中,我正在创建规则对象的实例并将它们添加到 rule_parts ArrayList。当我遍历数组时,循环执行预期的次数,但会复制最后一个元素。请有人指出原因。

Rules.Java

public class Rules {
public static String Gender;
public static Integer Age;


public Rules(String G, Integer C) {
//super();
    Gender = G;
    Age = C;
    }
}

主类 - MyArrayTest.java

import java.util.ArrayList;


public class MyArrayTest {


private static ArrayList<Rules> rule_parts = new ArrayList<Rules>();

public static void main(String[] args) {


// Rules Array  
rule_parts.add(new Rules("Male",25));
rule_parts.add(new Rules("Female",22));

System.out.printf("\n\nRules:\n\n");
for (Rules r : rule_parts) {
    System.out.printf (r.Gender + "\n");
    System.out.printf(r.Age + "\n");


    }

}

}

输出如下:

规则:

女性 22

女性 22

【问题讨论】:

  • 从你的类变量中移除 static 关键字。正如您现在拥有的那样,您已经定义了“全局”状态 - 对于类的 all 实例,类中的值也将始终是您上次设置的值。一般来说,不要将任何类变量设为静态,除非您知道自己在做什么并且有非常这样做的充分理由。
  • 除了 Perception 所说的:您似乎完全误解了 static 所做的事情。请阅读 Java 教程以了解这一点。

标签: java arraylist


【解决方案1】:

您需要将GenderAge 设为非static,否则这些字段将只为每个类成员变量保留一个值:

public String gender;
public Integer age;

除此之外: Java 命名约定表明变量以 小写 字母开头使得 Gender gender 等。

【讨论】:

    【解决方案2】:

    问题是你的数据成员是static

    public static String Gender;
    public static Integer Age;
    

    这意味着它们由类的所有实例共享。

    删除 static 关键字,一切顺利。

    【讨论】:

      【解决方案3】:

      问题是规则类中的静态变量。删除 static 关键字。静态变量是按类实例化的。所以总是取最新的值

      【讨论】:

      • 感谢 tm 的所有回复。在我的应用程序中,我最初的成员​​是非静态的,但是如果不将它们设置为静态,eclipse 就不会构建项目。我重新访问了 Java 文档,现在看到了错误。请注意,此代码之前确实构建良好,但我最近重建了我的开发机器,它在那时停止按预期工作。如果仍然失败,我将更新代码并重新发布。
      猜你喜欢
      • 2020-06-08
      • 2017-07-17
      • 1970-01-01
      • 2018-05-07
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多