ссылки на новые объекты с ссылками супер / подкласса JAVA - PullRequest
0 голосов
/ 21 декабря 2018

Я сейчас изучаю Java и не могу понять эту тему.ссылки на объекты подкласса с суперклассом.После просмотра нескольких веб-сайтов и постов мое замешательство только усилилось.Пример кода:

 public abstract class Bird {
    private void fly() {
        System.out.println("Bird is flying");
    }
    public static void main(String[] args) {
        Bird bird = new Pelican();
        bird.fly();
    }
}
class Pelican extends Bird {
    protected void fly() {
        System.out.println("Pelican is flying");
    }
}

Вывод «Птица летит» - почему?

Также у меня есть 3 вопроса:

Bird bird = new Pelican();
  1. Вчасть выше, что я могу использовать вместо типа Bird (если есть больше классов, расширяющих Bird)?Я готовлюсь к экзамену OCA 1, и вопросы по этой теме меня сильно смущают.

  2. Какие методы и переменные выводятся при использовании этих ссылок?В приведенном выше примере объект пеликана создан, но запускается метод fly: bird?

  3. Если кастинг выполнен, какие типы я могу использовать и какие типы я не могу?

Есть несколько вопросов об этом на stackoverflow и других веб-сайтах Java, но несколько источников, несколько ответов сбивают меня с толку.Я понимаю, что время ценно, но кто-то может, пожалуйста, раз и навсегда прояснить это сомнение для меня?

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Добро пожаловать в полиморфизм в Java!

Прежде всего, вы не можете создать экземпляр абстрактного класса , который является причиной проблемы компиляции здесь.

Выходные данные не " Пеликан летит ", поскольку закрытый метод не может быть переопределен, так как вы создаете объект пеликана (дочерний класс) со ссылкой на птицу (родительский класс).

Bird bird = new Pelican();

Если вы хотите получить желаемый результат « Пеликан летит », вам также понадобится ссылка на класс Child.

Pelican bird = new Pelican();
0 голосов
/ 21 декабря 2018

Чтобы вызвать метод из подкласса, вы должны использовать переопределение метода, которое также называется полиморфизмом времени выполнения.Поскольку объект, который вы объявили, - это Bird, и у него есть закрытый метод fly, который не может быть переопределен, вы получите «Bird летит».

Однако, если вы инициализируете его как

Pelican pelican = new Pelican ();

, тогда вы получите «Пеликан летит»

Подробнее об этом можно прочитать здесь https://www.geeksforgeeks.org/dynamic-method-dispatch-runtime-polymorphism-java/

0 голосов
/ 21 декабря 2018

В абстрактном классе ur Bird метод fly является приватным.Вы не можете наследовать или переопределять закрытый метод: следовательно,

class Pelican extends Bird {
 protected void fly() { System.out.println("Pelican is flying"); }
 }

на самом деле не переопределяет родительский метод.

Более того, у вашего кода проблемы компиляции , так как вы не можете вызватьприватный метод эталонного класса, а в вашем классе Bird метод fly имеет тип Private .

Снова скомпилируйте код.

...