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

Глава 2. Обзор языка Java 31_

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

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

Три принципа ООП

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

Инкапсуляция

Инкапсуляция — это механизм, который связывает код вместе с обрабаты­ваемыми им данными и сохраняет их в безопасности как от внешнего влия­ния, так от ошибочного использования. Можно представить инкапсуляцию как защитную оболочку, которая предохраняет код и данные от произволь­ного доступа из других кодов, определенных вне этой оболочки. Доступ к коду и данным внутри оболочки строго контролируется через хорошо опре­деленный интерфейс. Чтобы соотнести это с реальным миром, рассмотрим автоматическую трансмиссию автомобиля. Она инкапсулирует сотни бит информации о вашей машине, например, величину ускорения, наклон по­верхности, на которой находится машина, и позицию рукоятки передач. Как пользователь вы имеете только один метод воздействия на эту сложную ин­капсуляцию — перемещение рукоятки передач. Вы не можете, например, повлиять на трансмиссию, используя сигналы поворота или стеклоочисти­тели. Таким образом, рукоятка передач есть удачно определенный (на самом деле — уникальный) интерфейс к трансмиссии. Далее, все, что происходит внутри трансмиссии, никак не влияет на ее внешние объекты. Например, смещение рычага передач никак не сказывается на сигналах поворота.

32 Часть I. Язык Java

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

Основой инкапсуляции в языке Java является класс. Хотя классы будут под­робно рассмотрены дальше, здесь будет полезно их краткое обсуждение. Класс определяет структуру и поведение (данные и код) некоторого набора объектов. Каждый объект заданного класса содержит как структуру (дан­ные), так и поведение, определяемые классом (как если бы они были про­штампованы некоторым шаблоном в форме класса). По этой причине об объекте иногда говорят как об экземпляре класса. Таким образом, класс — это логическая конструкция, а объект — это физическая реальность1.

Когда вы создаете класс, нужно специфицировать код и данные, которые составляют этот класс. Все вместе эти элементы называют членами (mem­bers) класса. Данные, определяемые в классе, называют членами-переменными (member variables) или переменными экземпляра (instance variables). Код, опе­рирующий с этими данными, называют членами-методами (member methods) или просто методами2 (methods). В правильно записанных Java-программах методы определяют, как можно использовать члены-переменные. Это озна­чает, что поведение и интерфейс класса определяются методами, опери­рующими на данных его экземпляров.

Так как цель класса — инкапсуляция сложности, то существуют механизмы скрытия сложности реализации внутри класса. Каждый метод или перемен­ная в классе может быть помечена как private (частный или локальный) или public (общий). Модификатор public указывает на все, что нужно или можно знать внешним пользователям класса. Методы и данные с модификатором private могут быть доступны только в коде, являющемся членом данного класса. Любой код, не являющийся членом класса, не имеет доступа к private-методам или переменным. Так как private-члены класса оказываются доступными другим частям вашей программы только через public-методы класса, вы можете быть уверены, что никакие неподходящие действия не выполнятся. Конечно, это означает, что public-интерфейс должен быть тща­тельно спроектирован, чтобы не раскрывать слишком много внутренних членов класса (рис. 2.1).

1 Поскольку речь идет о программировании, точнее трактовать объект как экземпляр про­граммной модели некоторого реального (не обязательно физического) объекта. Класс в этом случае естественно трактуется как тип объекта. — Примеч. пер.

Если вы знакомы с языками C/C++, полезно знать следующее: то, что Java-программист называет методом, С/С++-программист называет функцией (function). — Примеч. пер.

Соседние файлы в папке JavaLit