УДК 004.45
СРАВНИТЕЛЬНЫЙ АНАЛИЗ ВЛОЖЕННЫХ КЛАССОВ
В ЯЗЫКАХ JAVA И С++
Ковтуненко С.В., Шевченко О.Г.
Донецький національний технічний університет
В докладе производится сравнительный анализ вложенных классов в языках Java и С++ (ANSI ISO/IEC 14882 1998). Язык программирования Java был разработан с расчётом взять лучшее из языка С++ и избавиться от недостатков и спорных, противоречивых моментов (таких как множественное наследование, явную работу с указателями и т.д.).
Вложенным называется класс, определённый внутри другого класса.
В языке программирования C++ вложенный класс находится в области видимости включающего его класса [3]. Характерным примером, иллюстрирующим вложенные классы С++ может служить класс для реализации связного списка, внутри которого определён класс, содержащий связи, и класс, в котором определяется позиция итератора.
сlass LinkedList
{
public:
class Iterator // вложенный класс
{
public:
void insert( int x );
int erase();
…
};
…
private:
class Link // вложенный класс
{
public:
Link *next;
int data;
};
…
}
Вложение классов имеет два основных преимущества: возможность управления доступом и управления именами.
Вложение классов представляет собой отношение между классами, а не между объектами. Объект класса LinkedList не сожержит подобъектов Iterator или Link. Т.к. имя Iterator вложено внутрь класса LinkedList, оно известно исключительно как LinkedList::Iterator и не конфликтует с другими классами, имеющими имя Iterator. Вложенный класс Link находится в приватном разделе класса LinkedList и полностью скрыт от остальной части программы. По этой причине можно объявлять его поля общедоступными, после чего методы класса LinkedList получат к ним доступ. Причём для остальных методов эти поля останутся невидимыми.
Вложенные классы в языке программирования С++ не содержат неявные ссылки на объект внешнего класса, который его создал.
В языке программирования Java различают следующие типы вложенных классов: статические (static), внутренние (inner), локальные (local), анонимные (anonymous) [1]. Таким образом, по сравнению с С++ были добавлены 3 новых типа вложенных классов. В Java дополнительную ссылку на объект внешнего класса не имеют только статические вложенные классы. Они являются полным аналогом вложенных классов С++.
Объект внутреннего класса содержит неявную ссылку на объект внешнего класса, который создал его, т.е. имеет доступ к данным объекта, в котором он определён. Это может быть полезно при реализации модели обратного вызова при программировании графического интерфейса пользователя (GUI). При этом внешний класс наследует поведение от существующего компонента GUI (например JButton), а внутренний класс реализует обработчики событий.
Локальные вложенные классы определяются внутри блоков, в которых они объявлены и их область видимости ограничивается этим блоком. Они никогда не объявляются с помощью модификаторов доступа (т.е. public или protected) [2]. Локальные вложенные классы имеют огромное преимущество – они полностью скрыты от внешнего мира и даже от остальной части внешнего класса, но при этом способны обращаться к локальным переменным в области видимости включающего класса.
Анонимный вложенный класс удобен, если нужно определить обратный вызов в процессе выполнения программы. Для этого не приходится создавать большой объём дополнительного кода [1]. Данный класс не имеет конструкторов, поскольку имя конструктора должно совпадать с именем класса, а в данном случае класс не имеет имени.
Разработчики языка программирования Java существенно расширили сферу применения вложенных классов и, по сравнению с языком С++, ввели в язык три дополнительных типа вложенных классов. Эти три типа вложенных классов призваны помочь Java программистам писать более лаконичный код и упростить поддержку кода.
Литература
[1] Хорстманн К.С., Корнелл Г. – Java 2. Том 1. Основы, 8-е изд., М.:Вильямс, 2008
[2] Брюс Эккель – Философия Java, 638с., СПб: Питер, 2009
[3] Подбельский В.В. – Язык С++: учебное пособие, 5-е изд., М.:Финансы и статистика, 2003, 560 с.: ил.