Автор: Widowmaker1984

Вопросы 45, 47, 48, 53 (инициализация, ее блоки и порядок)

"Где можно инициаилизировать статические/нестатические поля?"
"Зачем нужны и какие бывают блоки инициализации?"
"Каков порядок вызова конструкторов и блоков инициализации двух классов: потомка и его предка?"
"Что будет, если в static блоке кода возникнет исключительная ситуация?"


1. Блок инициализации (initialization block) — последовательность команд, выполняемых при создании (загрузке) классов и объектов. Существуют два типа: статический блок инициализации, обычно называемый для краткости статический блок (static block), и динамический блок инициализации (instance block).

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

2. Статический блок — это, в сущности, конструктор для всего класса. Его синтаксис:

static {
// Static block code
}

скрытый текст2.1. Команды в статическом блоке будут выполняется при первой загрузке класса. То есть в одном из двух случаев (том, что наступит раньше):
- При создании первого объекта класса в процессе работы программы, перед запуском конструктора.
- При первом вызове статической функции, перед выполнением.

2.2. Например, нужно создать класс, моделирующий автомобили, произведенные конкретной компанией. Каждый объект — это автомобиль, а в классе есть инициализируемое в статическом блоке статическое поле, которое содержит базу данных всех автомобилей.

2.3. Статический блок удобен, если в результате выполнения инициализирующего выражения происходит проверяемое исключение. Или же, если инициализация производится путем выполнения кода, который не может быть представлен в виде выражения.


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

3. Динамический блок представляет собой дополнение к конструкторам. Его синтаксис:
{
// Instance block code
}

скрытый текст3.1. Динамический блок выполняется, как если бы он был расположен в самом начале любого конструктора. Если блоков инициализации несколько, они выполняются в порядке следования в тексте класса. Блок инициализации способен генерировать исключения, если их объявления перечислены в предложениях throws всех конструкторов класса.

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

3.2.1. Динамический блок полезен, если необходимо инициализировать поле анонимного класса (в анонимном классе невозможно объявить конструктор)

4. При разработке языка Java был установлен постоянный порядок действий при загрузке.

4.1. Во время загрузки класса порядок выглядит следующим образом:

- Определения статических полей родительских классов.
- Инициализация статических полей и выполнение статических блоков родительских классов.
- Определения статических полей класса.
- Инициализация статических полей и выполнение статических блоков класса.

4.2. Затем, при создании объекта, порядок выглядит следующим образом:

- Определения полей объекта из родительских классов.
- Инициализация полей и выполнение динамических блоков из родительских классов.
- Выполнение конструкторов из родительских классов.
- Определения полей объекта из его класса.
- Инициализация полей и выполнение динамических блоков из его класса.
- Выполнение конструктора из его класса.

4.3. Итого порядок инициализации таков:

- Статические элементы родителя.
- Статические элементы наследника.
- Поля родителя.
- Конструктор родителя.
- Поля наследника.
- Конструктор наследника.

5. Статические поля можно инициализировать:
- при объявлении;
- в статическом блоке инициализации.

6. Нестатические поля можно инициализировать:
- при объявлении;
- в динамическом блоке инициализации;
- в конструкторе.

Комментарии


Лучшее   Правила сайта   Вход   Регистрация   Восстановление пароля

Материалы сайта предназначены для лиц старше 16 лет (16+)