【问题标题】:java array loop issue [duplicate]java数组循环问题[重复]
【发布时间】:2016-07-21 15:43:38
【问题描述】:

我有一个特殊的问题,当在数组中分配循环中的元素时,事情发生了。

当我移出循环并检查时,所有索引的相同数组值将设置为最后一个索引的值。以下是代码

JSONObject js = new JSONObject(json_string);
    JSONArray jsonArray=js.getJSONArray("customer");
    DataModelCollection[] dataModelCollection = new DataModelCollection[7];

for (int i=0;i<jsonArray.length();i++) {

    JSONObject json = jsonArray.getJSONObject(i);

    amont = json.getLong("BalanceAmount");
    custName = json.getString("CustName");
    partitionKey = json.getInt("PartitionKey");
    String date1 = json.getString("date");

    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = df.parse(date1);

    dataModelCollection[i] = new DataModelCollection();

    dataModelCollection[i].setName(custName);
    dataModelCollection[i].setAccountNo(partitionKey);
    dataModelCollection[i].setAmount(amont);
    dataModelCollection[i].setCollectedDate(date);


    Log.i("inside_loop", ""+dataModelCollection[i].getName());

    }

    Log.i("outside_loop", ""+dataModelCollection[0].getName());
    Log.i("outside_loop", ""+dataModelCollection[1].getName());
    Log.i("outside_loop", ""+dataModelCollection[2].getName());
    Log.i("outside_loop", ""+dataModelCollection[3].getName());
    Log.i("outside_loop", ""+dataModelCollection[4].getName());
    Log.i("outside_loop", ""+dataModelCollection[5].getName());
    Log.i("outside_loop", ""+dataModelCollection[6].getName());

当我打印基本上在循环中的inside_loop 时,值会正确显示。当执行出来并检查“outside_loop”时,所有索引的值都变为 dataModelCollection[6].getName() - 这是最后一个索引的值。 amount,date,partitionKey 也是如此。

不知道我哪里错了。

无论其价值如何,这里都是 DataModelCollection 模态类:

public class DataModelCollection {

public static long accountNo;
public static String name;
public static double amount;
public static Date collectedDate;

public DataModelCollection(long accountNo, String name, double amount, Date collectedDate) {
    this.accountNo = accountNo;
    this.name = name;
    this.amount = amount;
    this.collectedDate = collectedDate;
}

public DataModelCollection() {

}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public double getAmount() {
    return amount;
}

public void setAmount(double amount) {
    this.amount = amount;
}

public Date getCollectedDate() {
    return collectedDate;
}

public void setCollectedDate(Date collectedDate) {
    this.collectedDate = collectedDate;
}

public long getAccountNo() {
    return accountNo;
}

public void setAccountNo(long accountNo) {
    this.accountNo = accountNo;
}

我真的不知道是什么导致了这种情况。请帮忙。

【问题讨论】:

  • 您熟悉static 关键字的作用吗?

标签: java arrays


【解决方案1】:
public static long accountNo;
public static String name;
public static double amount;
public static Date collectedDate;

这些必须是实例变量,而不是静态变量。

删除static 关键字,它的行为应该如你所愿。

In laymans terms, what does 'static' mean in Java?

【讨论】:

    【解决方案2】:

    您必须从其中删除关键字static。不妨将其从public 更改为private,因为您正在使用setter 和getter 来更改这些值。

    public static long accountNo;
    public static String name;
    public static double amount;
    public static Date collectedDate;
    

    private long accountNo;
    private String name;
    private double amount;
    private Date collectedDate;
    

    它们都成为最后一个设置值的原因是因为static意味着变量属于class而不是实例“对象”。因此,即使您使用dataModelCollection[i] = new DataModelCollection(); 创建新对象,当您更改静态变量时,它们也会影响所有DataModelCollection 对象。更多关于静态/实例here的信息。

    【讨论】:

      【解决方案3】:

      DataModelCollection 类的属性是静态的! 这意味着它们对类的所有实例都是通用的。 因此,您的循环每次只需更改这些静态变量的值,因为它们对所有实例都是通用的。

      【讨论】:

        【解决方案4】:

        让我教你一些魔法!

        删除您在类 DataModelCollection 中声明的变量中的关键字 static 并且您的代码可以正常工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多