我有一个班级:
class Entity
{
private String question;
private String answer;
private static int length;
Crosswords cr = new Crosswords();
public Entity(int posX, int posY, int direction)
{
length = cr.getSpaceLength(posX, posY, direction);
}
public int getLength()
{
return length;
}
}
在另一个类中,我正在创建一个像这样的实体数组:
Entity[] et = new Entity[100];
然后我有一个计算长度的算法,我想保存每个实体的长度,但之后,当我这样做时:
for(int i=0; i<100; i++)
Console.WriteLine(et[i].getLength());
我为所有实体(最后一个实体的长度)获得相同的长度,但是我为它们设置了不同的长度。为什么会这样?我需要做些什么来为每个实体保存不同的长度?
P.S。
我像这样创建实体:
for(int i=0; i<100; i++)
et[i] = new Entity(somevalueX, somevalueY, direction);
答案 0 :(得分:4)
从长度中移除静电或更好地执行此操作,在需要时计算长度。
class Entity
{
private String question;
private String answer;
private int _posX;
private int _posY;
private int _direction;
Crosswords cr = new Crosswords();
public Entity(int posX, int posY, int direction)
{
_posX = posX;
_posY = posY;
_direction = direction;
}
public int getLength()
{
return cr.getSpaceLength(_posX, _posY, _direction);
}
}
答案 1 :(得分:2)
长度是静态成员,所有对象都有一个变量。如果你想为每个对象分开,它不应该是静态的。
更改
private static int length;
到的
private int length;
只有一个静态成员的副本存在,无论有多少 创建了类的实例MSDN。
在给定情况下预先计算所有对象的长度似乎并不值得。您可以在需要时计算并返回长度。我更愿意为length
而不是方法创建一个属性。
class Entity
{
private String question;
private String answer;
private int posX;
private int posY;
private int direction;
Crosswords cr = new Crosswords();
*//Make length a public property*
public int Length
{
get { return cr.getSpaceLength(posX, posY, direction);}
private set;
}
*//Assign the values to private members for later use.*
public Entity(int posX, int posY, int direction)
{
this.posX = posX;
this.posY = posY;
this.direction = direction;
}
}
答案 2 :(得分:0)
此行为的原因是您已将长度字段声明为静态。
虽然类的实例包含所有实例的单独副本 该类的字段,每个静态字段只有一个副本。