Spec-Zone .ru
спецификации, руководства, описания, API
След: Изучение Языка Java
Урок: Классы и Объекты
Раздел: Больше на Классах
Инициализация Полей
Домашняя страница > Изучение Языка Java > Классы и Объекты

Инициализация Полей

Как Вы видели, можно часто обеспечивать начальное значение для поля в его объявлении:

public class BedAndBreakfast {

    // initialize to 10
    public static int capacity = 10;

    // initialize to false
    private boolean full = false;
}

Это работает хорошо, когда значение инициализации доступно, и инициализация может быть помещена в одну строку. Однако, у этой формы инициализации есть ограничения из-за ее простоты. Если инициализация требует небольшого количества логики (например, обработка ошибок или a for цикл, чтобы заполнить сложный массив), простое присвоение является несоответствующим. Переменные экземпляра могут быть инициализированы в конструкторах, где обработка ошибок или другая логика могут использоваться. Чтобы обеспечить ту же самую возможность переменных class, язык программирования Java включает статические блоки инициализации.


Отметьте: не необходимо объявить поля в начале определения class, хотя это - наиболее распространенная практика. Только необходимо, чтобы они были объявлены и инициализированными прежде, чем они будут использоваться.

Статические Блоки Инициализации

Статический блок инициализации является нормальным блоком кода, включенным в фигурные скобки, { }, и предшествовал static ключевое слово. Вот пример:

static {
    // whatever code is needed for initialization goes here
}

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

Есть альтернатива статическим блокам — можно записать частный статический метод:

class Whatever {
    public static varType myVar = initializeClassVariable();
        
    private static varType initializeClassVariable() {

        // initialization code goes here
    }
}

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

Инициализация Членов экземпляра

Обычно, Вы поместили бы код, чтобы инициализировать переменную экземпляра в конструкторе. Есть две альтернативы использованию конструктора, чтобы инициализировать переменные экземпляра: блоки инициализатора и заключительные методы.

Инициализатор блокирует например взгляд переменных точно так же как статические блоки инициализатора, но без static ключевое слово:

{
    // whatever code is needed for initialization goes here
}

Компилятор Java копирует блоки инициализатора в каждого конструктора. Поэтому, этот подход может использоваться, чтобы совместно использовать блок кода между многократными конструкторами.

Заключительный метод не может быть переопределен в подклассе. Это обсуждается в уроке в интерфейсах и наследовании. Вот пример использования заключительного метода для того, чтобы инициализировать переменную экземпляра:

class Whatever {
    private varType myVar = initializeInstanceVariable();
        
    protected final varType initializeInstanceVariable() {

        // initialization code goes here
    }
}

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


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Понимание Экземпляра и Элементов Класса
Следующая страница: Сводка Создания и Используя Классы и Объекты