Ваш вопрос о полиморфизме, вы можете прочитать его на Полиморфизм в Java
В текущем случае выход будет
Пара Акулы
Пара животных
Пара животных
Объяснение
Эти строки
Shark bruce = new Shark();
Shark anchor = new Shark();
Animal donald = new Duck();
Duck daffy = new Duck();
утверждают, что Брюс - акула, якорь - акула, Дональд - утка, а Даффи - утка.
Во-вторых, строки, написанные ниже
class Shark extends Animal
class Duck extends Animal
, указывают, что и Акула, и Утка являются животными, плюс в каждом классе есть метод с именем makePair (). Теперь давайте перейдем к выводу, что, как это произошло
, первая строка вывода пришла от
bruce.makePair(anchor);
, поскольку мы уже знаем, что Брюс и якорь являются акулами, а метод, представленный в классе акул, является
public void makePair(Shark s) {
System.out.println("A pair of sharks");
}
, который показывает, что он принимает Акулу (тот же объект класса) в качестве параметра, поэтому он пришел таким образом.
Теперь переходим к последней строке вывода, которая
anchor.makePair(daffy);
поскольку мы знаем, что anchor - это акула, а Daffy - утка, теперь в этом случае компилятор проверяет, что метод, определенный в классе Shark, принимает утку в качестве параметра, если нет, он проверяет свой родительский класс, который есть метод, который принимает утку в качестве параметра. В этом случае метод, определенный в родительском классе
public void makePair(Animal a) {
System.out.println("A pair of animals");
}
, не принимает утку, но принимает животных, и мы знаем, что и акула, и утка - животные, поэтому это напечатано. Теперь давайте перейдем к самой захватывающей строке вывода в одну секунду, которая состоит из
donald.makePair(daffy);
, оба - утки, но результат - пара животных, потому что давайте вспомним определение объекта Дональда
Animal donald = new Duck();
здесь вы можете увидеть ссылку на родительский класс и объект дочернего класса. Теперь, когда возникает случай, объект определяется таким образом, и родительский и дочерний объекты имеют функцию с одинаковым именем ( Overloading ). Выполняемая функция является функцией ссылочного класса (который является родительским (Animal) классом) в этом случае, поэтому мы получили такой вывод.