Нет - как бы вы ожидали, что это сработает, если бы было два подкласса, которые пытались сделать то же самое? Если у вас есть статические конечные поля, они должны быть инициализированы классом, который их объявляет.
Если вы пытаетесь использовать статические поля и наследование вместе, это обычно признак того, что с чего-то не так, если честно - это две концепции, которые обычно плохо сочетаются друг с другом , Люди часто пытаются «подделать» наследование статическими методами и т. Д., И обычно оно плохо заканчивается - это звучит как вариация на эту тему.
Если вы сможете описать свою более широкую картину, мы можем помочь вам больше. Кстати, я бы призываю вас избегать статики в целом ради тестируемости. Они хороши для подлинных констант, но если это что-то похожее на конфигурацию, лучше передать соответствующие настройки при создании объекта (IMO).
РЕДАКТИРОВАТЬ: я вижу четыре варианта, которые будут лучше моделировать вашу ситуацию:
- Использовать аннотации: см. Ответ True Soft
- Создайте
maxHealth
a метод , чтобы вы могли спросить любого игрока, каково его максимальное здоровье - это тогда полиморфно, поэтому может быть переопределено в каждом классе
Модель Player
и PlayerClass
отдельно:
public class Player {
private final PlayerClass playerClass;
private int health; // etc
}
public class PlayerClass {
private final int maxHealth; //etc
}
Таким образом, вы можете иметь наследование на уровне "класса игрока", но вам не нужно - вы можете создать несколько PlayerClass
экземпляров, которые ведут себя одинаково , но имеют другую статистику ... или вы можете создать подкласс PlayerClass
, чтобы настроить поведение. В этот момент вам могут вообще не понадобиться разные подклассы Player
.
То же, что и идея 3, но с использованием перечисления:
public enum PlayerClass {
ELF(10), DWARF(9), HUMAN(5);
private final int maxHealth;
private PlayerClass(int maxHealth) {
this.maxHealth = maxHealth;
}
}
Лично я предпочел бы окончательный вариант, я подозреваю. Вы можете по-прежнему переопределять поведение, но у вас есть фиксированный набор возможных классов - который, вероятно, достаточно точно моделирует вашу игру.