Опубликован: 04.12.2009 | Доступ: свободный | Студентов: 8317 / 605 | Оценка: 4.30 / 3.87 | Длительность: 27:27:00
Лекция 11:

Встроенные классы

< Лекция 10 || Лекция 11: 123 || Лекция 12 >
Аннотация: Виды встроенных классов. Вложенные (nested) классы и интерфейсы. Внутренние (inner) классы. Локальные (local) классы. Анонимные (anonymous) классы и обработчики событий. Анонимные (anonymous) классы и слушатели событий (listeners).

11.1. Виды встроенных классов

Начиная с jdk 1.1 в язык Java были введены новые возможности для работы с классами, позволяющие реализовать дополнительные возможности инкапсуляции и композиции – так называемые "вложенные (nested) классы".

Они делятся на две категории:

  • статические ( static ) вложенные классы и интерфейсы - используются для задания совершенно самостоятельных классов и интерфейсов внутри классов. Статические вложенные классы должны при задании иметь модификатор static. Вложенные интерфейсы всегда считаются имеющими модификатор static. Имя класса верхнего уровня используется в качестве квалификатора в пространстве имен, во всем остальном они ведут себя как обычные классы;
  • нестатические ( non-static ), или, что то же, внутренние ( inner ) классы - служат для создания экземпляров, принадлежащих экземплярам класса верхнего уровня (т. е. их экземпляры не могут существовать вне объектов верхнего уровня). Внутренний класс можно задавать только для создания его экземпляров, не допускается создания методов класса или переменных внутреннего класса. Внутренние классы делятся на три разновидности:
    • внутренние классы общего вида, заданные внутри определения класса (на уровне задания полей данных и методов). Как правило такие классы используются для реализации агрегации, то есть варианта композиции, в котором встроенные объекты очень тесно связаны с внешним объектом и не могут без него существовать;
    • локальные ( local ) внутренние классы - задаются внутри блоков программного кода в блоках инициализации или методах. Они носят вспомогательный характер, область видимости и жизни экземпляров этих классов ограничивается соответствующим блоком программного кода;
    • анонимные ( anonymous ) внутренние классы - совмещают декларацию, реализацию и вызов. Не имеют ни имени, ни собственного конструктора (вместо него используется вызов прародительского конструктора со специальным синтаксисом вызова). Анонимные классы обычно используют в обработчиках событий.

11.2. Вложенные (nested) классы и интерфейсы

Вложенный класс задается во внешнем классе так:

class ИмяВнешнегоКласса{
     тело внешнего класса
     
     static class ИмяВложенногоКласса{
     тело вложенного класса
     }
     
     продолжение тела внешнего класса
}

Экземпляры вложенного класса, а также методы класса и поля класса получают в имени квалификатор – имя класса верхнего уровня.

Например, доступ к полю идет как

ИмяВнешнегоКласса.ИмяВложенногоКласса.имяПоля,

а обращение к методу класса – как

ИмяВнешнегоКласса.ИмяВложенногоКласса.имяМетода(список параметров).

Пусть у нас имя внешнего класса C1, а вложенного C_nested. Тогда создание экземпляра вложенного класса может идти, например так:

C1.C_nested obj=new C1.C_nested();

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

Пример:

class C1{
     private C_nested obj1;
     
     static class C_nested {
     тело вложенного класса
     }
     
     C_nested getNested(){
     return obj1;
     }
}

При компиляции для вложенных классов создаются самостоятельные классы .class, имеющие имя имяВнешнегоКласса$имяВложенногоКласса.class. Точно такое же имя выдается в методах объектВложенногоКласса .toString() или объектВложенногоКласса .getClass().getName(). А вот объектВложенногоКласса .getClass().getCanonicalName() возвращает имя вложенного класса через точку.

Задание вложенного интерфейса аналогично заданию вложенного класса:

class ИмяВнешнегоКласса{
     тело внешнего класса
     
     interface ИмяВложенногоИнтерфейса{
     объявление констант и заголовков методов
     }
     
     продолжение тела внешнего класса
}

Вложенные интерфейсы считаются имеющими модификатор static. Реализовывать вложенный интерфейс можно в постороннем классе – при этом имя интерфейса квалифицируется именем внешнего класса. Если же реализация идет в самом внешнем классе, квалификация именем этого класса не требуется.

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

< Лекция 10 || Лекция 11: 123 || Лекция 12 >
Максим Старостин
Максим Старостин

Код с перемещением фигур не стирает старую фигуру, а просто рисует новую в новом месте. Точку, круг.