Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Коллоквиум 2012.doc
Скачиваний:
25
Добавлен:
25.08.2019
Размер:
346.11 Кб
Скачать

3. Внутренние и вложенные классы Java

В теле класса можно сделать описание другого, вложенного (nested) класса. А во вложенном классе можно снова описать вложенный, внутренний (inner) класс и т. д.  Из вложенного класса можно обращаться к членам внешнего класса. Но определить экземпляр вложенного класса, не определяя экземпляры внешнего класса нельзя. Имя экземпляра вложенного класса уточняется именем связанного с ним экземпляра внешнего класса. Более того, при создании вложенного экземпляра операция new тоже уточняется именем внешнего экземпляра. 

Все вложенные классы можно разделить на вложенные классы-члены класса, описанные вне методов, и вложенные локальные классы, описанные внутри методов и/или блоков. Локальные классы, как и все локальные переменные, не являются членами класса.  Классы-члены могут быть объявлены статическим модификатором static. Поведение статических классов-членов ничем не отличается от поведения обычных классов, отличается только обращение к таким классам. Поэтому они называются вложенными классами верхнего уровня, хотя статические классы-члены можно вкладывать друг в друга. В них можно объявлять статические члены. Используются они обычно для того, чтобы сгруппировать вспомогательные классы вместе с основным классом.  Все нестатические вложенные классы называются внутренними (inner). В них нельзя объявлять статические члены.  Локальные классы, как и все локальные переменные, известны только в блоке, в котором они определены. Они могут быть безымянными, в этом случае, классы наз-ся анонимными. В безымянном классе не может быть конструктора, т.к. имя конструктора должно совпадать с именем класса; для этого прих-ся использовать имя суперкласса. Вместо конструктора в безымянном классе используется блок инициализации экземпляра. 

Вложенные классы существуют только на уровне исходного кода. Виртуальная машина Java ничего не знает о вложенных классах. Она работает с обычными внешними классами. Для взаимодействия объектов вложенных классов компилятор вставляет в них специальные закрытые поля. Поэтому в локальных классах можно использовать только константы объемлющего метода, т. е. переменные, помеченные словом final . Виртуальная машина просто не догадается передавать изменяющиеся значения переменных в локальный класс. Таким образом не имеет смысла помечать вложенные классы private , все равно они выходят на самый внешний уровень.

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

Если статические поля объявлены как final, это означает, что они должны быть проинициализированы строго один раз и затем уже больше не менять своего значения. Аналогично, статические методы могут быть объявлены как final, а это означает, что их нельзя перекрывать в классах-наследниках. Для инициализации статических полей можно пользоваться статическими методами и нельзя обращаться к динамическим. Вводят специальные понятия – статический и динамический контексты. К статическому контексту относят статические методы, статические инициализаторы, инициализаторы статических полей. Все остальные части кода имеют динамический контекст. При выполнении кода в динамическом контексте всегда есть объект, с которым идет работа в данный момент. Например, для динамического метода это объект, у которого он был вызван. Напротив, со статическим контекстом ассоциированных объектов нет. А раз нет ассоциированных объектов, то и пользоваться динамическими конструкциями нельзя. Можно только ссылаться на статические поля и вызывать статические методы. Либо обращаться к объектам через ссылки на них, полученные в результате вызова конструктора или в качестве аргумента метода.

Если выполнение кода происходит в динамическом контексте, то должен быть объект, ассоциированный с ним. В этом случае ключевое слово this возвращает ссылку на данный объект. В статическом контексте исп-ние this запрещено.