Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие Java .pdf
Скачиваний:
140
Добавлен:
16.03.2015
Размер:
1.32 Mб
Скачать

ГЛАВА 1. ПРИНЦИПЫ ООП. КЛАССЫ И ОБЪЕКТЫ

1.1 Основные принципы ООП

Традиционно называют три основных принципа ООП: инкапсуляцию, наследование и полиморфизм.

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

Т.о. инкапсуляция – это объединение данных и методов их обработки в одну сущность, имеющую чёткие границы (собственно, буквальный перевод термина – «заключение в оболочку»). Такой подход приводит к тому, что элементы сущности внутри «оболочки» могут тесно взаимодействовать друг с другом, а вот снаружи «оболочки» доступ должен быть ограничен. Т.е. «оболочка» (как и, например, скорлупа яйца) решает одновременно две задачи: удерживает содержимое внутри как одно целое, а также не даёт проникнуть внутрь несанкционированным образом. При описании класса эта «оболочка» реализуется с помощью разграничения доступа к элементам класса. Поэтому инкапсуляция – это сокрытие реализации класса и отделение его внутреннего представления от внешнего.

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

12

внутренней реализации при этом оказываются скрыты. Нарушение же инкапсуляции, как и везде, может привести к печальным последствиям: если оставить корпус компьютера открытым, туда может попасть какой-нибудь инородный предмет, благодаря которому работа компьютера будет затруднена или станет невозможна (например, не стоит вставлять дополнительную планку памяти в работающий компьютер). С другой стороны, некоторые специалисты держат у себя компьютеры без корпуса в разобранном виде (например, в качестве тестовых стендов для оборудования), что подчёркивает ещё одну особенность инкапсуляции: её иногда можно нарушать, но только если вы знаете, зачем вам это нужно, полностью контролируете ситуацию и понимаете последствия.

Название второго принципа – наследование – иногда приводит к проблемам понимания, т.к. в реальной жизни обычно наследуются объекты (например, фамильные драгоценности), да и наследниками тоже являются объекты (да, вы можете унаследовать цвет глаз вашей матери, но при этом и вы, и ваша мать остаются уникальными объектами). В ООП наследование происходит не между объектами, но между классами. Наследование – отношение между классами, при котором один класс использует структуру и поведение другого (одиночное наследование) или других (множественное наследование) классов. С одной стороны, наследование направлено на облегчение разработки и т.н. повторное использование кода. С другой стороны, при наследовании передаётся не только реализация, но и тип, и эти два аспекта наследования следует различать. При этом обычно класс-наследник как-то модифицирует, конкретизирует родительский класс.

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

13

нутого, типичные средства ввода и вывода, некоторые стандартные разъёмы. При этом другой наследный класс, например, суперкомпьютеры, может иметь совсем другие свойства, периферийные устройства и средства управления. Т.е. каждый из этих подклассов, сохраняя общие черты, по-своему конкретизирует особенности устройств. Ноутбуки, в свою очередь, можно считать наследниками персональных компьютеров, предъявляющими дополнительные требования к реализации, форме, весу и т.д. Но при этом они наследуют тип (внешнее представление) своего родительского класса: вряд ли кому нужен ноутбук без монитора, клавиатуры и хотя бы USB-разъёмов. Таким образом, благодаря наследованию классы образуют иерархию, каждый элемент которой дополняет и усложняет вышестоящие.

Обычно наибольшие затруднения в понимании вызывает третий принцип – полиморфизм, т.е. буквально «множественность формы». Формой в данном случае, опять же, является внешнее представление, а многими формами может обладать объект. Действительно, кроме внешнего представления своего собственного класса, объект также обладает, как минимум, внешними представлениями и всех родительских классов (его класс их унаследовал). Как следствие, объект может выступать в качестве экземпляра не только своего непосредственного класса, но и других классов. Полиморфизм – это способность объекта соответствовать во время выполнения двум или более возможным типам. Отличительной особенностью полиморфизма (по сравнению с двумя уже рассмотренными принципами) является то, что он говорит уже не только о классах, но и об объектах, существующих во время выполнения программы.

Допустим, у вас есть конкретный нетбук (пусть класс нетбуков является дочерним классом ноутбуков). Как нетбук он очень лёгкий и сравнительно недорогой (т.е. ваш нетбук удовлетворяет требованиям класса нетбуков, «принимает их форму»). С другой стороны, он является портативным, объединяет в себе устройства ввода и

14

вывода, т.е. «удовлетворяет форме» (или типу) ноутбуков. С третьей стороны, вы можете решать на нём те же задачи, что и на любом персональном компьютере: работать с текстами, графикой, выполнять вычисления и т.д. Т.е. ваш нетбук может выступать и в качестве экземпляра класса персональных компьютеров. А с четвёртой стороны, поскольку «внешняя оболочка» нетбука достаточно твёрдая, им можно забивать гвозди. Иначе говоря, нетбук также удовлетворяет типу «небольшие твёрдые предметы», объекты которого вполне допускают своё использование в качестве молотка. В данном случае особо примечателен тот факт, что конкретно это «внешнее представление» объекта было получено из другой иерархии наследования (даже ноутбуком забивать гвозди уже не так удобно). Т.е. особенную красоту полиморфизм приобретает при использовании именно множественного наследования.

Но самым важным моментом является даже не то, что нетбук можно использовать в различных целях и различным образом, а то, что способ использования (т.е. используемая «форма» объекта, его тип) может меняться в течение его жизни. Произведён он был как нетбук (создан объект класса нетбуков), но вы можете что-то на нём посчитать (как на персональном компьютере), потом перенести его (как ноутбук), потом снова посчитать, а потом позабивать гвозди.

Второй стороной полиморфизма является то, что если вам нужен объект некоторого типа, вам могут «подсунуть» любой объект, удовлетворяющий этому типу. Например, если вам понадобился доступ в интернет, ближайшей возможностью может оказаться ваш домашний персональный компьютер, компьютер в интернет-кафе, ноутбук вашего друга, или вообще какой-нибудь смартфон, который даже компьютером в классическом смысле слова не является (но в его внешнем представлении есть операции по доступу в интернет).

15

Соседние файлы в предмете Программирование на Java