Найти в Дзене
yagdmitrij

Наследование в java: super и переопределение методов

В прошлой статье мы остановились на том, как работают конструкторы без параметров при наследовании классов. В этой статье разберем: 1. Как работают конструкторы с параметрами 2. Ключевое слово super 3. Переопределение методов. Если за вызов конструктора суперкласса без параметров отвечает компилятор и нам не приходится напрягаться, то вызов конструктора с параметрами нам придётся оформить самим... с помощью ключевого слова super. Смотрим как это работает: Оператор super является мощным инструментом, который помогает реализовать принципы полиморфизма и наследования в java, обеспечивая корректную работу иерархии классов. Как мы и говорили ранее, создаем один объект Otez, а вызываются три конструктора: один – из класса Otez, два других из Pol и Semja. Вследствие чего, переменная imja инициализируется в самом конструкторе класса Otez, а переменные pol и familija – в конструкторах классов Pol и Semja через вызов конструкторов суперклассов с помощью ключевого слова super. Важное условие: вы

В прошлой статье мы остановились на том, как работают конструкторы без параметров при наследовании классов. В этой статье разберем:

1. Как работают конструкторы с параметрами

2. Ключевое слово super

3. Переопределение методов.

Если за вызов конструктора суперкласса без параметров отвечает компилятор и нам не приходится напрягаться, то вызов конструктора с параметрами нам придётся оформить самим... с помощью ключевого слова super.

Смотрим как это работает:

super конструктор
super конструктор

Оператор super является мощным инструментом, который помогает реализовать принципы полиморфизма и наследования в java, обеспечивая корректную работу иерархии классов.

Как мы и говорили ранее, создаем один объект Otez, а вызываются три конструктора: один – из класса Otez, два других из Pol и Semja. Вследствие чего, переменная imja инициализируется в самом конструкторе класса Otez, а переменные pol и familija – в конструкторах классов Pol и Semja через вызов конструкторов суперклассов с помощью ключевого слова super.

Важное условие: вызов конструктора с помощью super всегда должно осуществляться ПЕРВОЙ строкой в конструкторе подкласса!

Однако не только можно вызвать конструктор суперкласса с помощью ключевого слова super, но и его переменную, когда она скрыта переменной подкласса. Что значит скрыта? Это когда используется одинаковое название для переменных суперкласса и подкласса, т. е. говорят, что переменная подкласса скрывает переменную суперкласса.

super
super

Вот так с помощью super можно реализовать вызовы конструкторов и переменных из суперкласса. Ах, какая ты удивительная, super java!!!

Нужно отметить, что в литературе по java также может употребляться название суперкласса как «базовый», а подкласс – «производный». Очень легко запомнить «...ПРОИЗВОДНЫЙ подкласс расширяет свойства БАЗОВОГО суперкласса». Но рекомендую использовать все-таки подкласс и суперкласс, так как легко понять кто от кого наследуется, да и с ключевым словом super понятнее.

Переопределение метода java. Мы уже немного говорили о таких методах. Теперь разберем их подробнее, так как они используются только при наследовании. Вспоминаем: переопределенными методами называют такие методы, у которых совершенно одинаковые названия, параметры и тип, т.е. они идентичные, кроме самих тел методов. При этом один размещается в суперклассе, а другой – в подклассе. Не путаем с перегруженными методами у которых также одинаковые названия.

Прежде чем приступить к рассмотрению переопределенных методов, нужно понять одну вещь, а именно, что ОБЪЕКТ СУПЕРКЛАССА МОЖЕТ СПОКОЙНО ССЫЛАТЬСЯ НА ОБЪЕКТ ПОДКЛАССА. Рассмотрим это:

переопределение методов
переопределение методов

Собственно, что мы здесь видим. Ссылочная переменная суперкласса может ссылаться на объекты его подклассов. Что нельзя сказать о объекте Riba, который не наследуется от Rastenija. У каждого из трех объектов, расширяющих класс Rastenija, есть метод korenj(). Как мы видим, имена методов и типы идентичные, кроме самих тел. В этом случае говорят, что данные методы переопределены. По сути мы можем вышеприведенные объекты создать иным способом:

Rastenija ras=new Rastenija();

Rastenija ras=new Rosa();

Rastenija ras=new Malina();

Здесь мы используем ссылочную переменную суперкласса, хотя создаем объекты подкласса. Так как же наша программа понимает какой нужно вызвать метод korenj(), ведь тип ссылочной переменной у нас Rastenija? Дело в том, что выбор переопределенного метода осуществляется не во время компиляции программы, а на этапе ее выполнения, когда создаются объекты, т.е. выбирается нужный метод не по типу ссылочной переменной, а по типу созданного объекта. Это и называется динамической диспетчеризацией методов, которая является важным аспектом в достижении полиморфизма во время выполнения.

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

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

И в заключение, статья получилась большой, поэтому в следующей статье продолжим наследование и разберем такие понятия, как final и protected.

Ставьте лайки, подписывайтесь на канал и вас ждет масса увлекательных статей по java.

Моя телега, где буду выкладывать полезные штучки по java, а также анонс моих статей.

предыдущая статья о наследовании:

Наследование в java. Общие положения