For循环,多个对象实例化以及将对象添加到ArrayList问题

时间:2016-11-11 14:54:54

标签: java for-loop arraylist

在程序上遇到一些问题我试图写模拟卡片游戏“顶级特朗普”,更具体地说是将每张卡的属性添加到我的班级卡所持有的ArrayList中。 / p>

for (int i=1; i<5;i++)
    {
            int tempVal = rn.nextInt(10);
            Card.attrbts.add(new Attribute ("Attribute "+i, tempVal));
            System.out.println("Name: "+Attribute.name + " Value: " + tempVal); //debug
    }

该程序应该随机生成每个属性的值,为简单起见,我只是命名每个属性&#39;属性+ i&#39;。

循环在大多数情况下按预期执行,我可以从调试语句中看到正确生成的值和名称,但是,这个循环是在我的Card类中的ArrayList中添加元素它使用了列表中每个元素的名称和值相同,特别是for循环的最终迭代(例如,属性4和6)。

我想知道你们其中一个人是否可以帮我解释为什么会发生这种情况以及我该如何解决这个问题?

干杯

编辑:

public class Card {

static ArrayList<Attribute> attrbts = new ArrayList<Attribute>();
String name;

public Card(String n, ArrayList<Attribute>attr)
{
    this.name = n;
    this.attrbts = attr;
}

public class Attribute {
static String name;
static int val;


public Attribute(String n, int v){
    this.name = n;
    this.val = v;
}

2 个答案:

答案 0 :(得分:1)

您正在使用static字段nameval。静态字段由该类的所有对象共享。 相反,您希望每个对象/实例都有自己的版本。

为此,只需删除static

public class Attribute {
    String name;
    int val;

…
}

(你可能在你的属性构造函数中有一个警告,用于通过非静态引用访问静态字段)。

静态字段上有大量资源。例如,请查看Java Static vs Instance(感谢Murat指向此问题)。

当您以静态方式Attribute.name访问字段时,您的调试print语句将不起作用。 如果您想要访问该字段,则必须直接查询属性 object 。例如,将其保存为如下变量:

Attribute attr = new Attribute(…)
Card.attrbts.add(attr);
System.out.println("Name: " + attr.name + …)

答案 1 :(得分:0)

删除静态修饰符。那么每件事都应该完美无缺。