У меня есть абстрактный класс 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");
}
}
Вопрос в том, что мне нужно написать в цикле, чтобы распечатать имена и породы через массив?
наверняка вы должны переместить эти поля в суперкласс и рассматривать каждую запись как экземпляр Animal




Проблема заключалась в том, что вы определили 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 для имени и породы.
Ой! Ты прав. Я забыл добавить конструкторы для Dog и Fish. Я добавил их в пример. Они принимают имя и породу, а затем передают их конструктору суперкласса (Animal).
По какой причине вы не помещаете
breedиnameв абстрактный классAnimal?