Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум по объектно-ориентированному программированию..pdf
Скачиваний:
17
Добавлен:
05.02.2023
Размер:
3.39 Mб
Скачать

31

По данному классу доступной для пользователей частью являются открытые методы сеттеры и геттеры, а поля name и mark являются закрытыми. Доступ к ним осуществляется посредством сеттеров и геттеров. Мы скрыли часть реализации. Это очень важно при написании кода, который будет иметь дело с данными.

1.8.3 Наследование

Наследование – один из основополагающих принципов ООП.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Наследование – свойство системы, позволяющее описать но-

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

классом. Новый класс – потомком, наследником, дочерним или производным классом.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Главное преимущество наследования в том, что оно обеспечивает формальный механизм повторного использования кода и избегает дублирования. Унаследованный класс расширяет функциональность приложения благодаря копированию поведения родительского класса и добавлению новых функций. Это делает код сильно связанным. Если вы захотите изменить суперкласс, вам придется знать все детали подклассов, чтобы не разрушить код. Но наследование обладает и недостатком – сильная связанность: подкласс зависит от реализации родительского класса, что делает код сильно связанным.

Целью наследования является упорядочение классов в иерархическую древовидную структуру.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Иерархия классов представляется в виде древовидной струк-

туры, в которой более общие классы располагаются ближе к корню, а более специализированные – на ветвях и листьях.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Создадим класс-наследник GraduateStudent для нашего класса Student (рис. 1.11).

32

Student

GraduateStudent

Рис. 1.11 – Пример иерархии классов

Суперкласс, или родительский класс (иногда называемый базовым), содер-

жит все атрибуты и поведения, общие для классов, которые наследуют от него.

Например, в случае с классом Student все классы ниже по иерархии содержат

аналогичные атрибуты, такие как name, mark, а также сеттеры и геттеры, по-

этому нет необходимости дублировать их. Дублирование потребует много допол-

нительной работы и, что вызывает, пожалуй, наибольшее беспокойство, может

привести к ошибкам и несоответствиям. Подкласс, или дочерний класс (иногда

называемый производным), представляет собой расширение суперкласса. Таким

образом, класс GraduateStudent наследует все общие атрибуты и поведения

от класса Student. Класс Student считается суперклассом подклассов, или до-

черних классов, GraduateStudent. Наследование обеспечивает большое коли-

чество преимуществ в плане проектирования. Добавим в класс GraduateStu-

dent только поле thesis (тема ВКР), и получение среднего балла для диплом-

ника – метод GPA().

Для того чтобы один класс был потомком другого, необходимо при его

объявлении после имени класса указать ключевое слово extends и название

суперкласса. Он должен быть доступным классом и не иметь модификатора

final. Если ключевое слово extends не указано, считается, что класс унасле-

дован от универсального класса Object.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

В Java класс-наследник может иметь только одного родителя.

Множественное наследование в Java реализуется только через интер-

фейсы.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

class Имя_класса_наследника extends Имя_класса_родителя { // реализация

}

33

· · · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

Например, создадим класс Graduatestudent:

class GraduateStudent extends Student { private String thesis;

public GraduateStudent(String name, int mark, String thesis) {

super(name, mark); //вызываем конструктор суперкласса Student this.thesis = thesis;

}

public boolean GPA() { boolean result = false; if (getMark() >= 3)

result = true; return result;

}

//Переопределим метод toString() для класса GraduateStudent public String toString() {

return "ДИПЛОМНИК: " + super.toString() + " за ВКР: " + thesis;

}

}

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

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

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

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

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Полиморфизм (polymorphism) – положение теории типов, со-

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

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·