【问题标题】:Extended class and static variable扩展类和静态变量
【发布时间】:2014-03-02 10:24:40
【问题描述】:

我已经 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 值被覆盖。当然我可以在PlayerEnemy 中创建新的speed 变量,但是现有的DynamicObject 类是没有意义的。我希望每个班级都有不同的speed 值。当前类的所有对象都将具有相同的speed。我应该如何以正确的方式制作它?

【问题讨论】:

    标签: java inheritance static extends


    【解决方案1】:

    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);
       }
    }
    

    【讨论】:

    • getSpeed() 方法应该在超类中,而不是在每个子类中,因为它总是返回超类字段的值。而且我看不出在每个实例中都有一个变量的意义,因为给定类的所有实例的速度都是相同的。
    【解决方案2】:

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

    public abstract int getSpeed();
    

    在动态对象中,并且

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

    在播放器中。

    如果您需要在不实例化 Player 的情况下访问每个 Player 实例返回的恒定速度,只需使用

    public static final int CONSTANT_PLAYER_SPEED = 100;
    
    @Override
    public int getSpeed() {
        return 100;
    }
    

    并使用Player.CONSTANT_PLAYER_SPEED 访问所有玩家的速度。

    【讨论】:

      【解决方案3】:

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

      并且将静态变量设置为protected 并不会造成任何场景,因为继承和静态是完全不同的。

      protected float speed;
      

      【讨论】:

      • 我知道我可以做到,但在其余代码中,我需要在不创建任何对象的情况下获得速度。 :)
      【解决方案4】:

      你也可以有一个抽象方法,这意味着你总是必须在你的子类中重写它。

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

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-22
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多