
- •Эволюция методологий программирования. Парадигмы программирования.
- •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, сборка мусора
4. Средства инкапсуляции Java. Поддержка модульности. Пакеты
Основой инкапсуляции в Java является класс. Класс определяет данные и код некоторого набора объектов. При составлении класса код и данные необходимо специфицировать. Все эти элементы называют членами класса. Члены-переменные или переменные экземпляра являются данными. Члены методы или просто методы – код, оперирующий этими данными. Цель класса – инкапсуляция сложности. Для этого у методов и переменных внутри класса могут быть модификаторы доступа. Инкапсуляция означает, что данные объекта недоступны его клиентам непосредственно. Вместо этого они инкапсулируются — скрываются от прямого доступа извне. Инкапсуляция предохраняет данные объекта от нежелательного доступа, позволяя объекту самому управлять доступом к своим данным. С позиции инкапсуляции, модификаторы доступа позволяют ограничить нежелательный доступ к членам класса извне. Модификаторы доступа: - public – без ограничений; - private – только из данного класса; - protected – из данного класса и его потомков; - без модификатора – для всех классов данного пакета.
Открытые члены класса составляют внешнюю функциональность, которая доступна другим классам. Закрытыми (private) обычно объявляются независимые от внешнего функционала члены, а также вспомогательные методы, которые являются лишь деталями реализации и неуниверсальны по своей сути. Благодаря сокрытию реализации класса можно менять внутреннюю логику отдельного класса, не меняя код остальных компонентов системы. Очень часто используется доступ к свойствам класса только через его методы, который позволяет валидировать значения полей, так как прямое обращение к свойствам отслеживать крайне сложно, а значит им могут присваиваться некорректные значения на этапе выполнения программы. Такой принцип относится к управлению инкапсулированными данными и позволяет быстро изменить способ хранения данных. Если данные станут храниться не в памяти, а в файлах или базе данных, то потребуется изменить лишь ряд методов одного класса, а не вводить эту функциональность во все части системы.
Принцип модульности утверждает — каждый класс должен составлять отдельный модуль. Члены класса, к которым не планируется обращение извне, должны быть инкапсулированы.
Все классы Java распределяются по пакетам. Кроме классов пакеты могут включать в себя интерфейсы и вложенные подпакеты. Образуется древовидная структура пакетов и подпакетов. Эта структура в точности отображается на структуру файловой системы. Все файлы с расширением class (содержащие байт-коды), образующие пакет, хранятся в одном каталоге файловой системы. Подпакеты собраны в подкаталоги этого каталога. Каждый пакет образует одно пространство имен. Это означает, что все имена классов, интерфейсов и подпакетов в пакете должны быть уникальны. Имена в разных пакетах могут совпадать, но это будут разные программные единицы. Таким образом, ни один класс, интерфейс или подпакет не может оказаться сразу в двух пакетах. Если надо использовать два класса с одинаковыми именами из разных пакетов, то имя класса уточняется именем пакета: пакет.класс. Такое уточненное имя называется полным именем класса. Пакетами пользуются еще и для того, чтобы добавить к уже имеющимся правам доступа к членам класса private, protected и public еще один, "пакетный" уровень доступа. Если член класса не отмечен ни одним из модификаторов private, protected, public, то, по умолчанию, к нему осуществляется пакетный доступ: к такому члену может обратиться любой метод любого класса из того же пакета. Пакеты ограничивают и доступ к классу целиком — если класс не помечен модификатором public , то все его члены, даже открытые, public , не будут видны из других пакетов.
Пакеты могут располагаться на файловой системе или в базе данных. Пакеты, размещаемые на файловой системе имеют ряд ограничений на их организацию для обеспечения однозначности при поиске и загрузке (а также компиляции) типов (и единиц компиляции) и пакета.
При отображении (хранении) на файловой системе единица компиляции может содержать только один тип, объявленный public, совпадающий по имени с именем файла единицы компиляции.
Пакет содержит несколько единиц компиляции. Типы внутри единицы компиляции имеют доступ ко всем верхнеуровневым типам, объявленным в других единицах компиляции данного пакета а также к типам пакета java.lang. Для доступа к другим пакетам используется декларация import.
Объявление именованного пакета: PackageDeclaration: package PackageName; В качестве имени пакета выступает полное квалифицированное имя. Единицы компиляции безымянного пакета не содержат объявление пакета. Безымянные пакеты следует использовать только в небольших тестовых программах. Переменная окружения CLASSPATH содержит точки привязки иерархий пакетов к точкам в файловой системе (директории и архивные jar или zip файлы). Классы, находящиеся во всех «корневых» директориях точек привязки CLASSPATH, принадлежат к единому безымянному пакету.
Декларация имени пакета распространяется на всю единицу компиляции. Декларации import также распространяются на всю единицу компиляции. Для того, чтобы получить доступ к членам подпакета в единице компиляции, нужно явно импортировать эти члены. По умолчанию они не видны.
Будучи импортированными, типы становятся доступны в единице компиляции с использованием простого (не квалифицированного) имени.
Для того, чтобы иметь возможность обращаться к статическим методам, полям класса, а также к элементам перечислений без использования квалифицированного имени, можно воспользоваться статической декларацией импорта
Для обеспечения уникальности имени пакета в качестве основы следует использовать доменное имя организации. В случае если доменное имя не может быть использовано в силу наличия специальных символов, запрещенных к использованию в идентификаторах, нужно произвести следующую трансформацию: - если имя содержит знак ‘-’, его заменяют на ‘_’; - если имя является ключевым словом, то к нему добавляют ‘_’ - если имя начинается с цифры, то спереди добавляется ‘_’.
Полным квалифицированным именем является: - для примитивных типов – ключевое слово типа; - для именованного пакета первого уровня – простое имя этого пакета; - для именованного пакета уровня N – полное квалифицированное имя объемлющего пакета плюс простое имя пакета; - для класса или интерфейса в безымянном пакете – простое имя этого класса или интерфейса; - полное квалифицированное имя класса или интерфейса в именованном пакете – это полное квалифицированное имя пакета плюс простое имя класса или интерфейса. - класс (интерфейс) – член другого класса имеет полное квалифицированное имя только если таковое имеется у класса его содержащего. Исключение – безымянные классы. - Полное квалифицированное имя массива – это полное квалифицированное имя компонентного типа с последующим []