
- •Эволюция методологий программирования. Парадигмы программирования.
- •III семестр
- •Основные определения.
- •IV семестр (ответы на вопросы к экзамену по java freebrain.Ru)
- •1. Виртуальная машина Java. Структура программ. Типы переменных в Java. Принципы работы ClassLoader.
- •2. Средства абстракции Java
- •3. Внутренние и вложенные классы Java
- •4. Средства инкапсуляции Java. Поддержка модульности. Пакеты
- •5. Иерархические отношения в Java
- •6. Агрегация и зависимость от времени жизни. Реализация отношений клиент-сервер. Стандартные контейнеры.
- •7. Типизация. Правила преобразования типов. Instanceof и ClassCastException. Класс Class.
- •8. Средства поддержки параллелизма. Активные и пассивные объекты. Класс Object
- •9. Использование Thread и Runnable. Пул потоков, назначение и принципы реализации
- •10. Исключения. Обработка исключительных ситуаций
- •11. Сохраняемость. Serializable и Externalizable. Программирование распределенных приложений
- •12. Модель безопасности Java. Policy, Permissions, AccessController
- •14. Средства поддержки Java машины. System, Runtime, сборка мусора
3. Внутренние и вложенные классы Java
В теле класса можно сделать описание другого, вложенного (nested) класса. А во вложенном классе можно снова описать вложенный, внутренний (inner) класс и т. д. Из вложенного класса можно обращаться к членам внешнего класса. Но определить экземпляр вложенного класса, не определяя экземпляры внешнего класса нельзя. Имя экземпляра вложенного класса уточняется именем связанного с ним экземпляра внешнего класса. Более того, при создании вложенного экземпляра операция new тоже уточняется именем внешнего экземпляра.
Все вложенные классы можно разделить на вложенные классы-члены класса, описанные вне методов, и вложенные локальные классы, описанные внутри методов и/или блоков. Локальные классы, как и все локальные переменные, не являются членами класса. Классы-члены могут быть объявлены статическим модификатором static. Поведение статических классов-членов ничем не отличается от поведения обычных классов, отличается только обращение к таким классам. Поэтому они называются вложенными классами верхнего уровня, хотя статические классы-члены можно вкладывать друг в друга. В них можно объявлять статические члены. Используются они обычно для того, чтобы сгруппировать вспомогательные классы вместе с основным классом. Все нестатические вложенные классы называются внутренними (inner). В них нельзя объявлять статические члены. Локальные классы, как и все локальные переменные, известны только в блоке, в котором они определены. Они могут быть безымянными, в этом случае, классы наз-ся анонимными. В безымянном классе не может быть конструктора, т.к. имя конструктора должно совпадать с именем класса; для этого прих-ся использовать имя суперкласса. Вместо конструктора в безымянном классе используется блок инициализации экземпляра.
Вложенные классы существуют только на уровне исходного кода. Виртуальная машина Java ничего не знает о вложенных классах. Она работает с обычными внешними классами. Для взаимодействия объектов вложенных классов компилятор вставляет в них специальные закрытые поля. Поэтому в локальных классах можно использовать только константы объемлющего метода, т. е. переменные, помеченные словом final . Виртуальная машина просто не догадается передавать изменяющиеся значения переменных в локальный класс. Таким образом не имеет смысла помечать вложенные классы private , все равно они выходят на самый внешний уровень.
Внутренний (inner) класс – это класс который ни явно, ни неявно не является static Внутренний класс не может содержать блоков статической инициализации или членов-интерфейсов. Внутренний класс не может содержать статических членов за исключением полей-констант времени компиляции. Внутренние классы могут наследовать статические члены, не являющиеся константами времени компиляции. Члены-интерфейсы всегда являются static по умолчанию.
Если статические поля объявлены как final, это означает, что они должны быть проинициализированы строго один раз и затем уже больше не менять своего значения. Аналогично, статические методы могут быть объявлены как final, а это означает, что их нельзя перекрывать в классах-наследниках. Для инициализации статических полей можно пользоваться статическими методами и нельзя обращаться к динамическим. Вводят специальные понятия – статический и динамический контексты. К статическому контексту относят статические методы, статические инициализаторы, инициализаторы статических полей. Все остальные части кода имеют динамический контекст. При выполнении кода в динамическом контексте всегда есть объект, с которым идет работа в данный момент. Например, для динамического метода это объект, у которого он был вызван. Напротив, со статическим контекстом ассоциированных объектов нет. А раз нет ассоциированных объектов, то и пользоваться динамическими конструкциями нельзя. Можно только ссылаться на статические поля и вызывать статические методы. Либо обращаться к объектам через ссылки на них, полученные в результате вызова конструктора или в качестве аргумента метода.
Если выполнение кода происходит в динамическом контексте, то должен быть объект, ассоциированный с ним. В этом случае ключевое слово this возвращает ссылку на данный объект. В статическом контексте исп-ние this запрещено.