logo
Методичка Java

Вложенные (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.

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

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