передача переменной name при наследовании

94
23 января 2021, 22:50

не пойму как присобачить "Полкана" к "большому псу" сохраняя вызов конструктора предка. в остальном всё работает как надо

public class myDog{
  public static void main(String[] args){
    Dog dog1 = new Dog("Тузик", 2);
    bigDog bdog = new bigDog("Полкан", 3);
    Dog dog2 = new Dog();
    Dog dog3 = new Dog(3);
    dog1.voice();
    dog2.voice();
    dog3.voice();
    bdog.voice();
    System.out.println("всех собак: "+Dog.count);
  }
}
public class Dog {
  private int age;//возраст
  private   String name; //кличка
  static int count = 0;//количество
  public    Dog(String name, int age) {
    this.name = name; this.age = age;
    count++;
  }
  public Dog(){
    name = "щенок";
    count++;
  }
  public Dog(int age){
    name ="дворняга";
    this.age = age;
    count++;
  }
  public void   voice() {
    System.out.print("я "+name+": ");
    for(int i = 1; i <= age; i++) System.out.print("-гав");
    System.out.println();
  }
}
class bigDog extends Dog{
  bigDog (String name, int age) {
    super(name, age);
  }
  public void   voice() {
    System.out.print("я большой пёс");
    for(int i = 1; i < 5; i++) System.out.print("-ГАВ");
    System.out.println();
  }
}

результат:

я Тузик: -гав-гав
я щенок: 
я дворняга: -гав-гав-гав
я большой пёс-ГАВ-ГАВ-ГАВ-ГАВ
всех собак: 4

а хотелось бы:

я Тузик: -гав-гав
я щенок: 
я дворняга: -гав-гав-гав
я большой пёс Полкан: -ГАВ-ГАВ-ГАВ-ГАВ
всех собак: 4
  1. у Тузика есть кличка и он лает 2 раза(по количеству лет)
  2. у щенка ещё нет клички и он не умеет лаять
  3. у дворняги нет клички но она лает 3 раза(по количеству лет)
  4. большого пса зовут Полкан, он умеет громко лаять но не умеет считать
  5. всего посчитанных собак - 4(к счастью считает не Полкан)

если ещё подробнее то: в классе bigDog переменная name всего лишь параметр и не видна методу voice и нельзя объявить System.out.print("я большой пёс"+name);

с другой стороны name необходим super для вызова конструктора предка

всем спасибо вопрос решил добавлением поля name

class bigDog extends Dog{
  private String name;
  bigDog (String name, int age){
    super(name, age);
    this.name = name;
  }
  public void   voice(){
    System.out.print("я большой пёс "+name);
    for(int i = 1; i < 5; i++) System.out.print(" -ГАВ");
    System.out.println();
  }
}

всё работает как и задумывалось но с точки зрения ооп java всё ли верно и соответствует настроению?

Answer 1

объявляйте свои классы всегда с большой буквы BigDog, MyDog

public class Dog {
...
/* добавить геттер*/
  public String getName() {
    return this.name;
  }
}

в классе BigDog в вывод добавить getName():

class BigDog extends Dog{
  BigDog (String name, int age) {
    super(name, age);
  }
  public void   voice() {
    System.out.print("я большой пёс " + getName() + ":");
    for(int i = 1; i < 5; i++) System.out.print("-ГАВ");
    System.out.println();
  }
}

и все работает:

я Тузик: -гав-гав
я щенок: 
я дворняга: -гав-гав-гав
я большой пёс Полкан:-ГАВ-ГАВ-ГАВ-ГАВ
всех собак: 4
READ ALSO
Аналог await Task.Delay(1000) в JavaFX

Аналог await Task.Delay(1000) в JavaFX

господаЕсть такое задание: разработать программу, изображающую на экране работающие электронные часы с цифровым индикатором, а также с индикацией...

120
Mozilla декодирует url в адресной строке

Mozilla декодирует url в адресной строке

Mozilla декодирует закодированный url в адресной строкеИз-за чего получаю bad request, т

82
Настройка компилятора TypeScript

Настройка компилятора TypeScript

Есть ли способ заставить Классы в TypeScript компилироваться в Фабричные Функции, где приватные свойства и методы не будут попадать в прототип?...

119
Найти экземпляр объекта/класса Javascript

Найти экземпляр объекта/класса Javascript

Хочу написать "патч" для одной веб игры (На JS), весь код минифицирован, поэтому лезть в него не самая лучшая идея

126