当前位置: 首页 > 面试题库 >

如何继承静态字段并更改其值?

艾奕
2023-03-14
问题内容

我正在开发具有参数的静态实用程序类的程序/游戏。

class ParamsGeneral {
   public static final int H_FACTOR = 100;
   public static int MAX_SCORE = 1000;
   ...
}

那么在某些特定情况下,例如在地图上打分数有限时,我需要覆盖此值。所以我做了以下事情:

class ParamsLimited extends ParamsGeneral {
   public static int MAX_SCORE = 500;
   // other params stay same
}

预期的用法如下:

class Player {
   ParamsGeneral par;
   public Player() {
      if(onLimitedMap()){
          par = new ParamLimited();
      }
   }

   public boolean isWinner() {
      if(this.score == par.MAX_SCORE) {
          return true;
      }
      return false;
   }
}

我实际上没有测试过此代码,因为IDE抱怨要通过实例调用静态字段,也要隐藏字段。我清楚地看到此代码很臭,所以有没有办法实现这一目标,还是我必须分别编写每个param类?

PS:我知道我应该使默认类抽象并使用getters,我很好奇是否有一种方法可以使值静态可访问。


问题答案:

您不能覆盖静态成员-
在Java中,方法和字段都不能被覆盖。但是,在这种情况下,您似乎不需要执行任何操作:由于ParamsGeneralpar变量中具有的实例,因此非静态方法将通过常规重写来满足您的需要。

class ParamsGeneral {
    public int getMaxScore() {
        return 1000;
    }
}
class ParamsLimited extends ParamsGeneral {
    @Override public int getMaxScore() {
        return 500;
    }
}

...

public boolean isWinner() {
    // You do not need an "if" statement, because
    // the == operator already gives you a boolean:
    return this.score == par.getMaxScore();
}


 类似资料:
  • 我有一个私有int数组,我需要以某种方式找到长度,但在静态类下无法做到这一点。我必须保持类的静态,是否可以添加其他方法来将a.length更改为其他方法? 该问题是由a.length引起的。

  • 问题内容: 我无法理解以下输出。 我不知道为什么输出为10,我认为该行创建了B类的新实例,我认为结果应为20 为什么这样工作..请解释。 问题答案: 首先,请参见 隐藏字段 (添加了重点) 在一个类中,与超 类中的字段 同名的字段会 隐藏超类的字段 ,即使它们的类型不同 换句话说,这是不是“遗产”,因为你实际上隐藏的背后的,和你正在使用的参考对象,所以你得到它的领域。如果这样做了,您将看到预期的效

  • 问题内容: 如果我们运行派生类,它将打印派生类和父类。是否有任何方法可以防止静态块的继承? // Class 1 // Class2 基本上我在父类中有一些方法要继承,但不希望实例化派生类时发生在父静态块中的处理。有没有办法做到这一点,否则我将不得不复制代码? 问题答案: 没有。 你不能这样做 。 静态的initialzier块不会被继承。 由于基类扩展了超类,因此在加载类时将执行静态块,即使超类

  • 问题内容: 我不太明白为什么可以在Java中继承静态方法? 继承就像从基类继承,而Static属于Class而不是Object。 那么,如果静态仅属于该类,为什么它会滴入派生类呢?它不应该只与定义它的类一起使用吗? 继承静态方法是一种好的编程习惯吗? 问题答案: 在Java中,静态方法不是 继承的 (或正确的词被 覆盖 ),但可以 隐藏 。 这里最大的不同是它们不像对象方法那样经受多态性。 运行时

  • 问题内容: 假设我有以下课程: 以及这两个子类: 和 我的问题是这两个子类从父类共享相同的静态curID成员,而不是拥有不同的成员。 所以,如果我这样做: r1,r2,r3的ID为0,1,2,而t1,t2,t3的ID为3,4,5。除了这些,我希望t1,t2,t3的值分别为0、1、2,即使用curID静态变量的另一个副本。 这可能吗?如何? 问题答案: 正如其他人已经写过的,静态成员已绑定到该类,因

  • 问题内容: 我想要以下设置: 这在Java中可能吗?怎么样?如果可以避免的话,我宁愿不使用实例变量/方法。 谢谢! 编辑: 常量是数据库表的名称。每个子对象都是一个微型ORM。 问题答案: 您无法完全按照自己的意愿去做。也许可以接受的折衷方案是: