我想创建一个具有不同属性的类列表,但我遇到了一个问题:当我添加一个新的时,所有其他的都是修改的。(代码非常大,所以我只发布一个小样本)
public abstract class A{
public static Point Position;
public static int LifePoints;
public static int range;
public static int atackValue;
public static double movementSpeed;
public double getMovementSpeed() {
return movementSpeed;
}
public static void setMovementSpeed(double movement) {//this n funciona
movementSpeed = movement;
}
(...)to make the topic shorter i only show the movement part but class A contains all getters and setters for all movement,position,range,life points and attack value
}
public class B extends A{
public static Point Position;
public static int LifePoints=10000;
public static int range=50;
public static int atackValue=100;
public static double movementSpeed=2;
public A(Point startPoint){
setMovementSpeed(movementSpeed);
setAtackValue(atackValue);
setRange(range);
setLifePoints(LifePoints);
setPosition(startPoint);
}
public class createB(){
(...)
public void create(){
private List<B> list = new ArrayList<B>();
B b = new B(startpoint);
list.add(b);
}
(...)
for(int x=0;x!=list.length();x++){
move(list.get(x));
system.out.println(list.get(x).getMovementSpeed());
}
println为所有创建的b返回正确的值(2.0),但每次创建新b时,其他所有b都停止移动,新b移动速度比前一个快。移动功能由我的老师制作,并确认它正常工作。我怀疑位置不正常,而不是移动图片2像素,它只移动X次。
答案 0 :(得分:7)
那是因为你有静态字段而不是实例变量。
答案 1 :(得分:1)
第一点是static
字段是类分配的:所有实例只有一个字段。
但是,您的样本中还存在其他基本错误。
如果创建子类,它将从其超类继承所有字段。你不需要重复那些。这是继承的全部要点。您的初始值应在构造函数中设置。
类的构造函数应该在该类中定义,并且与该类的名称相同。在类A
中声明构造函数B
是没有意义的(我猜你发布这个的调整并不是很干净)。您的代码似乎也存在一些不平衡括号的问题。
你似乎有一个方法之外的执行语句(或静态初始化块,但让我们单独留下),这也没有意义。
如图所示,抽象类A
完全是多余的。
您的方法create
似乎永远不会返回它创建的列表。你想怎么用它?
使用缩进。 Java中的标准是每个嵌套块的4个缩进空间。
正确命名变量。变量应始终以小写字母开头。以大写字母开头的名称表示类。
总而言之,我感到很困惑。你应该尝试阅读更多真实项目的代码,以获得对语言的感觉。