УДК 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 с.: ил.


© Ковтуненко С.В., Шевченко О.Г., 2009