Инкапсуляция, полиморфизм и наследование

Классы и объекты

 

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

 

Знакомство с ООП

 

Язык программирования Java является полностью объектно-ориентированным. Это означает, что программа, написанная на языке Java, должна строго соот­ветствовать парадигме объектно-ориентированного программирования (ООП). Следует понимать, что принципы ООП не просто определяют структуру про­граммы. Это некий фундаментальный подход, если угодно, философия програм­мирования, на которой имеет смысл остановиться подробнее перед непосред­ственным изучением основ языка Java.

Принципы, на которых базируется ООП, во многом объясняются причинами, приведшими к появлению ООП как такового. Не вдаваясь в детали, отметим лишь, что в свое время в развитии принципов программирования и программ­ных языков наступил момент, когда сложность прикладных программ достигла уровня, критического для понимания программистами. Традиционный подход который получил название процедурного программирования, неприменим для составления больших и сложных программ. Любая программа связана с данны­ми и методами обработки этих данных. Если данных и методов много, в рамках одной программы достаточно сложно разумно структурировать программный код. Такие коды на профессиональном сленге называют «спагетти»-кодами, по­скольку отдельные ветви алгоритма программы переплетаются, образуя нечто наподобие запутанного клубка, в котором крайне сложно разобраться. Пробле­ма была принципиальной. Из такой критической ситуации необходимо было ис­кать принципиальный выход, и такой выход был найден в рамках нового подхо­да, который получил название объектно-ориентированного программирования. Объектно-ориентированный подход в программировании основан на нескольких принципах, достаточно простых и прагматичных. Обычно выделяют три фун­даментальных принципа, которые, как три слона, поддерживающие в представ­лении древних землю на своих спинах, составляют основу ООП: инкапсуляция, полиморфизм и наследование. Кроме этих принципов, вводятся также два важ­ных понятия — это понятия класса и объекта. Именно с класса и объекта мы и начнем.

Классы и объекты

Чтобы решить проблему упорядочивания программного кода, было принято ре­шение ввести четкое разграничение данных и методов обработки этих данных. Более того, данные и соответствующие им методы объединили в одну структу­ру, которая в ООП называется объектом.

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

В классе описывается, какого типа данные относятся к классу (данные называ­ются полями класса), а также то, какие методы применяются к этим данным. Затем в программе на основе того или иного класса создается экземпляр класса (объект), в котором указываются конкретные значения полей и выполняются необходимые действия над ними. Различие между классом и объектом поясним на простом примере, не имеющем никакого отношения к программированию. Поговорим о домашних животных, таких как коты и собаки. Проводя аналогию с программированием, можем определить класс Кот и класс Собака. Опреде­ление класса производится через указание полей (данных) и методов класса. Для класса Кот в качестве полей укажем имя (кличку кота) и окрас (цвет). Для класса Собака задаем поля имя (кличка собаки), окрас и породу. Помимо полей, определим методы для этих классов. По большому счету метод — это то, что может делать объект соответствующего класса (или что можно делать с объек­том). Коты будут мяукать и ловить мышей, а собаки — лаять и вилять хвостом. Отсюда методами класса Кот являются мяукать и ловить мышей, а класса Со­бака — лаять и вилять хвостом. Таким образом, мы определили шаблоны, на основании которых впоследствии будут создаваться экземпляры классов или объекты. Разница между классом и объектом такая же, как между абстрактным понятием и реальным объектом. При создании объекта класса задаем конкрет­ные значения для полей. Когда мы говорим о собаке вообще, как понятии, мы имеем в виду домашнее животное, у которого есть имя, окрас, порода и кото­рое умеет лаять и вилять хвостом. Точно так же, понятие кот означает, что он мяукает и ловит мышей, к нему можно обратиться по имени, и шубка у него может быть какого-то цвета. Это — абстрактные понятия, которые соответству­ют классу. А вот если речь идет о конкретном Шарике или Мурзике, то это уже объекты, экземпляры класса.

Представим, что во дворе живут три собаки и два кота: Шарик (дворняжка коричневого окраса), Джек (рыжий спаниель), Ричард (черная немецкая овчар­ка), Мурзик (белый и пушистый кот) и Барсик (черный кот с белой маниш­кой). Каждый из пяти этих друзей представляет собой объект. В то же время они относятся к двум классам: Шарик, Джек и Ричард являются объектами класса Собака, а Мурзик и Барсик — объектами класса Кот. Каждый объект в пределах класса характеризуется одинаковым набором полей и методов. Од­новременно с этим каждый объект уникален. Хотя Шарик, Джек и Ричард являются объектами одного класса, они уникальны, поскольку у них разные имена, породы и окрасы. Лают и виляют хвостом они тоже по-разному. Но даже если бы мы смогли клонировать, например, Шарика и назвать пса тем же име­нем, у нас, несмотря на полную тождественность обеих Шариков, было бы два объекта класса Собака. Каждый из них уникален, причем не в силу каких-то физических различий, а по причине того, что один пес существует независимо от другого.

 

Инкапсуляция, полиморфизм и наследование

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

Инкапсуляция позволяет объединить данные и код обработки этих данных в одно целое. В результате получаем нечто наподобие «черного ящика», в ко­тором содержатся все необходимые данные и код. Указанным способом созда­ются обсуждавшиеся уже объекты. Объект является именно той конструкцией, которая поддерживает и через которую реализуется механизм инкапсуляции.

Забегая наперед, отметим, что данные и код внутри объекта могут быть от­крытыми, доступными вне объекта, и закрытыми. В последнем случае доступ к данным и коду может осуществляться только в рамках объекта.

С точки зрения указанного подхода класс является базовой единицей инкапсу­ляции. Класс задает формат объекта, определяя тем самым новый тип данных в широком смысле этого термина, включая и методы, то есть программный код для обработки данных. Через концепцию класса данные связываются с про­граммным кодом. В пределах класса данные представляются в виде переменных, а программный код — в виде функций (подпрограмм). Функции и переменные класса называются членами класса (соответственно, методами и полями).

Полиморфизм позволяет использовать один и тот же интерфейс для выполне­ния различных действий. Здесь действует принцип «Один интерфейс — много методов». Благодаря полиморфизму программы становятся менее сложными, так как для определения и выполнения однотипных действий служит единый интерфейс. Такой единый интерфейс применяется пользователем или програм­мистом к объектам разного типа, а выбор конкретного метода для реализации соответствующей команды осуществляется компьютером в соответствии с ти­пом объекта, для которого выполняется команда.

Важнейшим механизмом в ООП является наследование. Именно наследование позволяет усовершенствовать эволюционным способом программный код, со­храняя при этом на приемлемом уровне сложность программы. Наследова­ние — это механизм, с помощью которого один объект может получить свойства другого объекта, что позволяет создавать на основе уже существующих объек­тов новые объекты с новыми свойствами, сохраняя при этом свойства старых объектов. Например, если мы решим создать новый класс Породистая собака, который от класса Собака отличается наличием поля награды на выставках, то в общем случае пришлось бы заново создавать класс, описывая в явном виде все его поля и методы. В рамках ООП с помощью механизма наследования можно создать новый класс Породистая собака на основе уже существующего класса Собака, добавив в описании класса только новые свойства — старые наследу­ются автоматически. Наследование — удобный и полезный механизм, который детально описан в следующих главах книги.

Преимущества ООП

Применение концепции ООП позволило существенно упростить процесс напи­сания программ и расширило возможности в составлении сложных программ­ных кодов. Среди основных преимуществ ООП выделим следующие.

В ООП благодаря механизму наследования можно многократно использовать созданный единожды программный код. Это позволяет существенно эконо­мить время на создание нового кода.

Все ООП-программы достаточно хорошо структурированы, что улучшает их читабельность, да и работать с таким структурированным программным кодом намного приятнее.

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

ООП-программы в случае необходимости легко дорабатываются и расширя­ются. Данная особенность крайне важна при создании больших проектов.

Несмотря на все это, следует четко понимать, что концепция ООП эффектив­на лишь в том случае, когда речь идет о больших и сложных программах. Для создания простых программ лучше использовать простые приемы.

 








Дата добавления: 2016-06-13; просмотров: 1838;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.008 сек.