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

1.2 Достоинства ООП

Упрощение разработки обуславливается следующими особенностями.

Разделение функциональности: чем больше и сложнее программная система, тем важнее становится разделение её на небольшие, четко очерченные части. Чтобы справиться со сложностью, необходимо абстрагироваться от мелких деталей. Для этой цели классы являются достаточно удобным инструментом.

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

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

Возможность создания легко расширяемых систем обуслав-

ливается следующими факторами.

Обработка разнородных структур данных: благодаря поли-

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

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

Полиморфизм и программирование в соответствии с типом:

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

16

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

1.3 Недостатки ООП

Неэффективность на этапе выполнения. Существует фактор,

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

Неэффективность в смысле распределения памяти. Динами-

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

Излишняя избыточность. В библиотечном классе часто содержится больше методов, чем это реально необходимо. А поскольку лишние методы не могут быть удалены, то они становятся мертвым грузом. Это не воздействует на время выполнения, но влияет на возрастание размера кода и время разработки.

Психологическая сложность проектирования. Как не пара-

доксально (ведь многие понятия и подходы в ООП взяты из реальной жизни), но у программистов (особенно писавших на процедур-

17

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

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

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

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

Как говорилось ранее, в основном написанное далее будет относиться к J2SE 1.4, пока не будет специально оговорено, что рассматривается JavaSE 5.

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

Состояние объекта – значения, описывающие объект, определяются его полями.

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

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

18

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

Ниже приведен пример простого класса, названного Body, объекты которого будут описывать небесные тела.

Пример 1. Простой класс

class Body

{

public

long idNum;

public

String name;

public

Body orbits;

public

static long nextId = 0;

}

 

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

Body mercury;

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

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

19

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