Как сделать массив унаследованных объектов - Java

У меня есть абстрактный класс Animal и классы наследования Fish и Dog. Мне нужно создать различные объекты из рыб и собак, дать им имена и породы, а также придумать способы их передвижения. Наконец, мне нужно создать их массив и сделать 4 случайных отпечатка, на которых будут указаны их имя и порода.

Основной класс:

public class JavaApplication38 {


public static void main(String[] args) {


   Animal[] arr = new Animal[20];

    arr[0] = new Fish("Riby", "Sea Fish");
    arr[1] = new Dog("Any", "Great Dane");
    arr[2] = new Fish("Ribytsa", "River fish");
    arr[3] = new Dog("Jackie", "Pug");
    arr[4] = new Fish("Bobi", "Mix");
    arr[5] = new Dog("Ruby", "Labrador");    

    }

}

Класс животных

public abstract class  Animal {

  public Animal(String name, String breed){

  } 



   public Animal(){
   }

   public abstract void moving();

}

Класс собак

Public class Dog extends Animal{


private String breed;
private String name;

public Dog(){
}

 public Pas(String name, String breed){
     this.name = name;
     this.breed =breed;
}


@Override
public void moving() {
    System.out.print("Walk\n");
}

}

Класс рыбы

public class Fish extends Animal {


private String breed;


private String name;

public Fish(){

}

public Fish(String name, String breed){
    this.name = name;
    this.breed= breed;
}

@Override
public void moving(){
    System.out.print("Swims\n");
}

}

Вопрос в том, что мне нужно написать в цикле, чтобы распечатать имена и породы через массив?

По какой причине вы не помещаете breed и name в абстрактный класс Animal?

Powerlord 29.11.2018 22:53

наверняка вы должны переместить эти поля в суперкласс и рассматривать каждую запись как экземпляр Animal

m.antkowicz 29.11.2018 22:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
1 771
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключалась в том, что вы определили name и breed отдельно в каждом подклассе Animal. Вам необходимо сделать переменные экземпляра name и breed в Animal. Таким образом, Java знает, что у каждого животного есть name и breed.

public abstract class Animal {
    private String name;
    private String breed;

    public Animal(String name, String breed) {
        this.name = name;
        this.breed = breed;
    }

    public getName() { return name; }
    public getBreed() { return breed; }

    public abstract void moving();
}

public class Dog extends Animal {
    public Dog(String name, String breed) {
        super(name, breed);
    }

    @Override
    public void moving(){
        System.out.print("Walks\n");
    }
}

public class Fish extends Animal {
    public Fish(String name, String breed) {
        super(name, breed);
    }

    @Override
    public void moving(){
        System.out.print("Swims\n");
    }
}

Теперь вы можете распечатать name и breed для любого Animal, будь то Dog или Fish.

Animal[] arr = new Animal[6];

arr[0] = new Fish("Riby", "Sea Fish");
arr[1] = new Dog("Any", "Great Dane");
arr[2] = new Fish("Ribytsa", "River fish");
arr[3] = new Dog("Jackie", "Pug");
arr[4] = new Fish("Bobi", "Mix");
arr[5] = new Dog("Ruby", "Labrador");

for (Animal a : arr) {
   System.out.println(a.getName() + " " + a.getBreed());
   a.moving();
}

arr [0] = новая рыба ("someName", "someBreed"); означает, что имя и порода назначаются конструктору рыбы, а не конструктору животных. Когда я его компилирую, он дает мне null null для имени и породы.

Feniks 29.11.2018 23:23

Ой! Ты прав. Я забыл добавить конструкторы для Dog и Fish. Я добавил их в пример. Они принимают имя и породу, а затем передают их конструктору суперкласса (Animal).

axblount 30.11.2018 16:02

Другие вопросы по теме