Я предполагаю, что на ваш прямой вопрос (может быть наследуется статический) был дан ответ. Я подумал, что предлагаю альтернативный подход:
С вашего вопроса я предполагаю, что вы хотите не добавлять 4 байта в каждый экземпляр с их уникальным значением атаки, так как каждый воин имеет 50 атак, это должно быть 1 место, которое перечисляет это , Это решение по-прежнему будет стоить 4 байта в случае 1 номера, но будет более оптимальным в случае более чем 1 из этих чисел.
class Army {
private final ArmyConfiguration configuration;
public Army() {
this("Army");
}
public Army(String configurationName) {
this.configuration = ConfigFactory.getInstance().getConfiguration(configurationName)
}
public ArmyConfiguration getArmyConfiguration() { return configuration; }
}
class Warrior {
super("Warrior");
}
class Archer {
super("Archer");
}
class ConfigFactory {
private static ConfigFactory instance;
public synchronized ConfigFactory getInstance() {
if (instance == null) {
instance = new ConfigFactory();
}
return instance;
}
private Map<Class, ArmyConfiguration> configMap;
public ConfigFactory() {
this.configMap = new HashMap<Class, ArmyConfiguration>();
configMap.put("Army", new ArmyConfiguration(0));
configMap.put("Warrior", new ArmyConfiguration(50));
configMap.put("Archer", new ArmyConfiguration(75));
}
public ArmyConfiguration getConfiguration(String name) {
return configMap.get(name);
}
}
class ArmyConfiguration {
public final int attackValue;
public ArmyConfiguration(final int attackValue) {
this.attackValue = attackValue;
}
}
Конечно, это не идеальный (синглтон может и не быть тем, чего вы хотите). Эта настройка позволит вам загружать конфигурацию с диска без необходимости перекомпилировать файлы. (во время конструктора ConfigFactory загрузите файл с диска, проанализируйте его и создайте экземпляры)
Таким образом вы разделяете фактические настройки/конфигурацию объектов по логике, которым нужны эти объекты. Для мелкомасштабных вещей, hardcoding - это вариант, для больших проектов, которые вы, возможно, захотите извлечь.
«каждый объект Warrior будет иметь значение атаки 50» Неверно, статическая переменная не принадлежит объекту – JamesB
Статическая переменная разделяет значение с каждым объектом класса, который его объявляет. Поэтому каждый подкласс будет иметь и это значение. Если основной класс или другой подкласс изменить это значение, каждый класс (независимо от родителя или подкласса) будет иметь новое значение. Итак, да, вам нужно объявить новую статическую переменную для каждого подкласса. – BackSlash
Возможный дубликат [Java - Начать статическое поле и изменить его значение] (http://stackoverflow.com/questions/16202884/java-inherit-static-field-and-change-its-value) –