java数组循环问题

java array loop issue

本问题已经有最佳答案,请猛点这里访问。

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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()-这是最后一个索引的值。amountdatepartitionKey也是如此。

不知道我哪里弄错了。

不管它的价值是什么,这里的DataModelCollection模式类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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;
}

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


1
2
3
4
public static long accountNo;
public static String name;
public static double amount;
public static Date collectedDate;

这些需要是实例变量,而不是静态变量。

删除static关键字,它的行为应该符合您的需要。

用俗语来说,"静态"在Java中意味着什么?


让我教你一些魔法吧!

删除在类DataModelCollection中声明的变量中的关键字static,代码工作正常。


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


您必须从其中每一个中删除关键字static。也可以将它从public更改为private,因为您使用setter和getter来更改这些值。

1
2
3
4
public static long accountNo;
public static String name;
public static double amount;
public static Date collectedDate;

1
2
3
4
private long accountNo;
private String name;
private double amount;
private Date collectedDate;

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