Вызов конструктора подкласса с переменной, влияющей на супер-конструктор - PullRequest
0 голосов
/ 18 января 2020

Я пытаюсь создать класс Mammals, расширяющий абстрактный класс Animal, который можно вызывать из основного метода с помощью int, определяющего, что содержит вид String. Однако целое число никак не влияет на строку в моем коде ниже, потому что необходимо, чтобы вызов супер-конструктора был первым оператором в конструкторе подкласса. Как я могу снова вызвать супер-конструктор с "актуализированной" строкой? Я уже пытался создать перегруженный конструктор в подклассе и сначала вызвать его, но, похоже, это не сработало.

public abstract class Animals {
  protected String species;
  public Animals(String species) {
    this.species = species;
  }
}
class Mammals extends Animals{
  static String species;
  public Mammals(int speciesNumber) {
    super(species);
    if(colorNumber == 0){
      species = "Dog";
    }
    else if(speciesNumber == 1){
      species = "Cat";
    }
    else if(speciesNumber > 1){
      species = "Horse";
    }
  }
}

1 Ответ

2 голосов
/ 18 января 2020

как только вы передадите значение, вы передадите его. обновление значения позже не влияет на то, что вы дали ранее. Легко исправить, хотя:

class Mammals extends Animals {
    public Mammals(int speciesNumber) {
        super(toSpeciesName(speciesNumber));
    }

    private static  String toSpeciesName(int speciesNumber) {
        // your if/elseif block here, or probably just a switch/case block.
    }
}

Примечание: не дублируйте поля, подобные этим; если ваш родительский класс имеет поле с именем species, не делайте другое поле с именем species в подклассе. Вы ничего не переопределяете, у вас есть 2 совершенно не связанных поля, одно из которых «затенено» и очень труднодоступное. Плохой план Кроме того, сделать это * * * c здесь странно. Не делай этого тоже. Это будет означать, что более одного из них потерпит неудачу.

...