Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие Java .pdf
Скачиваний:
118
Добавлен:
16.03.2015
Размер:
1.32 Mб
Скачать

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

Весьма широкое применение находят и конструкторы без параметров. Если, объявляя класс, вы не создали ни одного конструктора какой бы то ни было разновидности, компилятор автоматически включит в состав класса пустой конструктор без параметров. Подобный конструктор (его называют конструктором по умолчанию) создается только в том случае, если других конструкторов не существует, поскольку можно привести примеры классов, в которых применение конструктора без параметров нецелесообразно или вовсе невозможно. Конструктор по умолчанию получает тот же признак доступа, что и класс, для которого он создается: если объявление класса снабжено модификатором public, то и конструктор будет помечен как public. Если необходимы и конструктор без параметров, и один или несколько дополнительных конструкторов, первый должен быть создан явно.

В тексте конструкторов допускается упоминание объявляемых исключений (см. главу 3). Предложение throws помещается после списка параметров, непосредственно перед открывающей фигурной скобкой, которая отмечает начало тела конструктора. Если в объявлении конструктора присутствует предложение throws, любой метод, который косвенным образом обращается к конструктору при выполнении оператора new, обязан либо обеспечить «отлов» исключений упомянутых типов с помощью соответствующих предложений catch, либо перечислить эти типы в разделе throws собственного объявления.

1.14 Блоки инициализации

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

39

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

Пример 11. Блок инициализации класса class Body {

public long idNum;

public String name = "<Без имени>"; public Body orbits = null;

private static long nextID = 0;

{

idNum = nextID++;

}

Body (String bodyName, Body orbitsAround) { name = bodyName;

orbits = orbitsAround;

}

}

Теперь конструктор с двумя параметрами не должен выполнять явный вызов конструктора без параметров, как раньше, поскольку необходимые действия совершит блок инициализации. Подобный вариант применения блоков инициализации нельзя назвать самым удачным – мы обратились к нему только для того, чтобы продемонстрировать синтаксис. На практике блоки инициализации используют для выполнения более сложных операций, когда отсутствует необхо-

40

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

1.15 Статическая инициализация

Статическим полям класса позволено иметь инициализаторы, но язык предусматривает возможность выполнения более сложных операций в контексте блока статической инициализации. Блок статической инициализации во многом подобен обычному блоку инициализации – отличия состоят в применении модификатора static, возможности обращения только к статическим членам класса и запрете на генерацию объявляемых исключений. Далее приведен пример статической инициализации небольшого массива простых чисел (простым называют натуральное число, которое без остатка делится только на единицу и само на себя).

Пример 12. Статический блок инициализации class Primes {

static int[] knownPrimes = new int[4];

static {

knownPrimes[0] = 2;

for (int i = 1; i< knownPrimes.length; i++) knownPrimes[i] = nextPrime(i);

}

// объявление nextPrime...

}

Поля класса инициализируются последовательно – сначала выполняются первые по порядку выражение или блок инициализации, затем следующие и т.д. Операции статической инициализации

41

Соседние файлы в предмете Программирование на Java