Тип данных из подкласса или суперкласса при вызове конструктора подкласса? - PullRequest
0 голосов
/ 31 октября 2019

Я новичок в Java, и я пытался создать простую программу полиморфизма.

public abstract class Animal {
    public abstract void action();
}

public class Cow extends Animal {

    @Override
    public void action() {
        System.out.println("Im a cow.");
    }
}
public class Sheep extends Animal {

    @Override
    public void action() {
        System.out.println("Im a sheep.");
    }
}
1 import java.util.ArrayList;
2
3 public class Main {
4
5   public static void main(String[] args) {
6       ArrayList<Animal> animals = new ArrayList<Animal>();
7       Animal cow = new Cow();
8       Animal sheep = new Sheep();
9       animals.add(cow);
10      animals.add(sheep);
11
12      for (Animal animal : animals) {
13          animal.action();
14      }
15  }
16 }

Мне было интересно, есть ли разница между этим и изменениемтип данных из строки 7 в Cow -> Cow cow = new Cow(); и тип данных из строки 8 в Sheep -> Sheep sheep = new Sheep(); Мне очень любопытно, потому что вывод точно такой же.

1 Ответ

1 голос
/ 31 октября 2019

Разницы нет, переменная cow используется только для добавления ее к ArrayList<Animal>.

. Может быть разница в зависимости от конкретного случая использования, поскольку переменная Cow может иметь дополнительныеметоды, которых нет в Animal, но семантически они будут вести себя эквивалентно.

Единственное отличие состоит в том, что вы можете вызывать для переменной cow.

В общем, этоВсегда лучше использовать наименее конкретный тип, который вы можете, чтобы быть уверенным, что вы не используете какую-либо конкретную функцию, которую вы не хотели бы использовать. Этот же принцип применим к animals переменным, лучше объявить:

List<Animal> animals = new ArrayList<>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...