2016-11-11 123 views
0

在编写程序时遇到了一些麻烦,以模拟纸牌游戏“Top Trumps”,更具体地说,将每张卡片的属性添加到ArrayList由我的班级持有。For循环,多个对象实例化并将对象添加到ArrayList问题

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 
    } 

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

循环大多数情况下按预期执行,值和名称的生成方式正如我从调试语句中可以看到的,但是,当此循环向我的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; 
} 
+0

你的'Card'和'Attribute'类是怎么样的? –

+0

什么是Card.attrbts? – PeterMmm

+0

我已更新问题 – fornax666

回答

1

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

为此,只需删除static。 (您应该已经在您的Attribute构造函数中通过非静态引用访问静态字段时收到警告)。

有很多静态字段的资源。例如看看Java Static vs Instance(感谢Murat指出这个问题)。


你调试打印语句将无法正常工作,因为你在一个静态的方式Attribute.name访问的领域。 如果您想要访问该字段,则必须直接查询对象的属性。例如,将其保存到如下变量中:

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

删除静态修饰符。每件事情都应该完美地工作。