扩展类和静态变量

时间:2014-03-02 10:24:40

标签: java inheritance static extends

DynamicObjectPlayerEnemy

public class DynamicObject {

    protected static float speed;
}



public class Player extends DynamicObject {
       /*some code*/
       Player.speed = 100;
}


public class Enemy extends DynamicObject {
       /*some code*/
       Enemy.speed = 50;
}

并且始终覆盖speed值。当然,我可以在speedPlayer中创建新的Enemy变量,但是现有的DynamicObject类是没有意义的。我希望每个类都有不同的speed值。当前类的所有对象都具有相同的speed。我该如何正确地做到这一点?

4 个答案:

答案 0 :(得分:4)

speed变量不应为static。否则,它不会绑定到DynamicObject类的任何实例,也不会绑定到任何子类实例。

如果您希望每个子类具有不同的speed值,则可以执行以下操作:

public class DynamicObject {    
    protected float speed;

    public DynamicObject(float speed) {
        this.speed = speed;
    }

    public float getSpeed() {
       return this.speed;
    }
}

public class Player extends DynamicObject {
   /*some code*/
   public Player(float speed) {
       super(speed);
   }

}


public class Enemy extends DynamicObject {
       /*some code*/
   public Enemy(float speed) {
       super(speed);
   }
}

答案 1 :(得分:4)

如果每个DynamicObject都有一个速度,并且每个实例(例如Player)的速度相同,那么你应该有

public abstract int getSpeed();

在DynamicObject中,

@Override
public int getSpeed() {
    return 100;
}
播放器中的

如果您需要在不实例化播放器的情况下访问为evry实例播放的常量速度,请使用

public static final int CONSTANT_PLAYER_SPEED = 100;

@Override
public int getSpeed() {
    return 100;
}

并使用Player.CONSTANT_PLAYER_SPEED来获取所有玩家的速度。

答案 2 :(得分:2)

从该变量中删除静态,如果变量是静态的,则它属于该类,而不属于实例。

保护静态变量不会产生任何场景,因为继承和静态是完全不同的。

protected float speed;

答案 3 :(得分:1)

您还可以使用抽象方法,这意味着您必须始终在子类中覆盖它。

public abstract class Dynamic {

protected float speed; 

abstract void setSpeed();
}
public class Player extends Dynamic{
@Override
void setSpeed() {
    this.speed=50;
}

}