Использование переменной суперкласса для доступа к объекту производного класса - PullRequest
2 голосов
/ 26 марта 2019

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

class Programmer {
    void print() {
        System.out.println("Programmer - Mala Gupta");
    }
}

class Author extends Programmer {
    void print() {
        System.out.println("Author - Mala Gupta");
    }
}

class TestEJava {
    Programmer a = new Programmer();
    Programmer b = new Author();
    b.print();
}

Следуя этому коду, я получаю вывод наподобие 'Author - Mala Gupta'; несмотря на это, я должен выполнить метод родителя. Не могли бы вы объяснить мне, что происходит за кулисами?

Ответы [ 4 ]

2 голосов
/ 26 марта 2019

Вы не должны получать вывод «Программист - Мала Гупта», потому что вы создаете объект Author:

new Author();

Programmer в данном случае это просто ссылка на объект. И эта ссылка может указывать на любой объект Programmer и его подклассы.

Но, когда вы вызываете метод, вы вызываете его для объекта, указанного ссылкой. И это Author.

0 голосов
/ 26 марта 2019

Эта концепция связана с Полиморфизм времени выполнения . Здесь ссылочная переменная "b" принадлежит родительскому классу (Programmer), а объект принадлежит дочернему классу (Author).

Теперь ссылочная переменная "b" указывает на дочерний класс (Author).

Существует два определения метода print (): один принадлежит программисту, а другой принадлежит классу Author. Определение вызываемого метода основывается на объекте, на который ссылается ссылочная переменная. Процесс, при котором вызов функции разрешается во время выполнения.

Таким образом, всякий раз, когда вы вызываете b.print (), вы получите вывод:

0 голосов
/ 26 марта 2019

Когда переопределенный метод вызывается через ссылку на суперкласс, Java определяет, какую версию этого метода выполнить, основываясь на типе объекта, на который ссылается во время вызова.Таким образом, это определение выполняется во время выполнения.

Это тип объекта, на который ссылаются (а не тип ссылочной переменной), который определяет, какая версия переопределенного метода будет выполняться.

Поэтомуесли суперкласс содержит метод, который переопределяется подклассом, то при обращении к различным типам объектов через ссылочную переменную суперкласса выполняются разные версии метода.Вот почему вы получаете вывод: Автор - Мала Гупта

0 голосов
/ 26 марта 2019

Programmer - родительский класс, а Author - дочерний элемент Programmer. Родительский класс содержит ссылку на объект дочернего класса, но вы можете вызывать только те методы, которые находятся в Родительском классе.

В Programmer b на самом деле есть ссылка класса Author. Вот почему он вызвал функцию класса Author. его называют Polymorphism.

...