. Лекция 06. Наследование и полиморфизм¶
Лекция 06. Наследование и полиморфизм¶

Лекция 06. Наследование и полиморфизм¶

Наследование - механизм передачи данных и кода от одних классов другим, тип отношений между классами.

Для выражения наследования в языке имеется специальное ключевое слово extends

Рассмотрим следующие классы:

Класс Employee (работник) мы получаем с использованием наследования от класса Person

super означает ссылку на родительский класс, которому мы передаем данные для конструктора.

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

Вызов конструктора непосредственного суперкласса:

super (parameters) – вызов должен быть первым в конструкторе подкласса

Доступ к элементу суперкласса, скрытому элементом подкласса:

super.var_name или super.metod_name()

(super не влияет на тип доступа)

Понятие наследования¶

Теперь можно создать работника и выяснить личную информацию:

Запрет наследования¶

В некоторых случаях наследование можно запретить:

С помощью final можно запретить переопределение избранных методов.

Модификатор final¶ Переопределение методов¶

В производных классах можно переопределять методы родительских классов:

Для переопределения нужно точно воспроизвести заголовок родительского метода.

Для надежности в производном классе используют аннотацию:

Переопределение метода (overriding) – создание в подклассе

метода, совпадающего по сигнатуре с методом суперкласса.

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

Полиморфизм¶

Динамическая диспетчеризация¶
  1. Динамическая диспетчеризация ссылок
  2. Динамическая диспетчеризация методов

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

Динамическая диспетчеризация методов – это механизм, позволяющий определить какой из переопределенных методов нужно вызвать, во время выполнения, а не во время компиляции.

Абстрактные методы и классы¶ Абстрактные классы и методы¶

В Java существуют абстрактные классы, которые можно использовать только для наследования, но не для создания экземпляров (объектов).

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

Модификатор abstract

Можно объявлять абстрактыми методы и классы.

Если в классе есть хотя бы один абстрактный метод, то класс должен быть объявлен абстрактным.

Любой подкласс абстрактного класса должен или реализовать все его абстрактные методы или сам должен быть объявлен абстрактным

Абстрактные классы и методы¶

Объявление абстрактного метода:

Интерфейсы¶

Интерфейсы - это особый вид классов.

  1. Интерфейсы допускают множественное наследование
  2. Все методы – абстрактные (без модификатора abstract)
  3. Все переменные – static и final (без соотв. модификаторов), необходима инициализация
  4. Все переменные и методы – public (без модификатора)

Особенности реализации интерфейсов:

  1. Методы, которые реализуют интерфейс, должны быть объявлены как public. Сигнатура типа реализующего метода должна точно соответствовать сигнатуре типа, указанной в определении интерфейса.
  2. Если класс включает интерфейс, но реализует не все его методы, то такой класс должен быть объявлен как абстрактный.
  3. Если класс реализует интерфейс, унаследованный от другого интерфейса, класс должен реализовать все методы, определенные в цепочке наследования интерфейсов.

Интерфейсы можно использовать для импорта в различные классы совместно

используемых констант. В том случае, когда вы реализуете в классе

какой-либо интерфейс, все имена переменных этого интерфейса будут

видимы в классе как константы. Если интерфейс не включает в себя методы,

то любой класс, объявляемый реализацией этого интерфейса, может вообще

ничего не реализовывать.

Класс Object¶

Все классы, создаваемые разработчиком, имеют наследование от системного класса Object

Для своих классов можно переопределить:

  • toString() - преобразование в строку
  • hashCode() - вычисление хэш-кода объекта
  • equals() - проверка двух объектов на равенство
  • clone() - создание копии объекта
  • finalize() - аналог деструктора
  • getClass() - получение типа объекта
  • Object clone() – создает новый объект, являющийся копией вызывающего
  • boolean equals(Object object) – определяет, является ли один объект равным другому
  • void finalize() – завершающие действия перед вызовом gc
  • String toString() – возвращает строку, содержащую описание вызывающего объекта. Этот метод вызывается автоматически, когда объект выводится методом print() или println(). Многие классы переопределяют данный метод, приспосабливая описание специально для типов объектов, которые они создают.

При определении equals() обычно требуется переопределить hashCode()

📎📎📎📎📎📎📎📎📎📎