Инициализация статических данных
Данные статических полей всегда существуют в единственном экземпляре, независимо от количества созданных объектов. Ключевое слово static не может применяться к локальным-переменным, только к полям. Если статическое поле относится к примитивному типу, при отсутствии явной инициализации ему присваивается значение по умолчанию. Если это ссылка на объект, то ей присваивается значение null.
Если вы хотите провести инициализацию в месте определения, она выглядит точно так же, как и у нестатических членов класса.
Следующий пример помогает понять, когда инициализируется статическая память:
//• initialization/StaticInitialization.java // Указание значений по умолчанию в определении класса, import static net mindview util Print *;
class Bowl {
Bowl(int marker) {
print("Bowl(" + marker + ")"),
}
void fl(int marker) {
print("fl(" + marker + ")");
}
}
class Table {
static Bowl bowll = new Bowl(l); TableO {
print("Table()"); bowl 2.f1(1),
}
void f2(iлt marker) {
print("f2(" + marker + ")");
}
static Bowl bowl2 = new Bowl(2);
}
class Cupboard {
Bowl bowl3 = new Bowl(3), static Bowl bowl4 = new Bowl(4). CupboardO {
printC'CupboardO"). bowl4 fl(2).
}
void f3(int marker) {
print(>Mf3(" + marker + ")"),
}
static Bowl bowl5 = new Bowl(5);
}
public class Staticlnitialization {
public static void main(String[] args) {
print ("Создание нового объекта Cupboard в mainO"), new CupboardO;
print ("Создание нового объекта Cupboard в mainO"), new CupboardO; table.f2(l). cupboard f3(l),
}
static Table table = new TableO, static Cupboard cupboard = new CupboardO; } /* Output; Bowl(1) Bowl(2) TableO fl(l) Bowl(4) Bowl(5) Bowl(3) Cupboard() fl(2)
Создание нового объекта Cupboard в mainO Bowl(3) CupboardO fl(2)
Создание нового объекта Cupboard в mainO Bowl(3)
CupboardО fl(2) f2(l) f3(l) *///:-
Класс Bowl позволяет проследить за процессом создания классов; классы Table и Cupboard содержат определения статических объектов Bowl. Заметьте, что в классе Cupboard создается нестатическая переменная Bowl bowl3, хотя все остальные определения — статические.
Из выходных данных программы видно, что статическая инициализация происходит только в случае необходимости. Если вы не создаете объектов Table и никогда не обращаетесь к Table.bowll или Table.bowl2, то, соответственно, не будет и объектов static Bowl bowll и static Bowl bowl2. Они инициализируются только при создании первого объекта Table (или при первом обращении к статическим данным). После этого статические объекты повторно не переопределяются.
Сначала инициализируются static-члены, если они еще не были проинициали-зированы, и только затем нестатические объекты. Доказательство справедливости этого утверждения легко найти в результате работы программы. Для выполнения main() (а это статический метод!) загружается класс Staticlnitialization; затем инициализируются статические *поля table и cupboard, вследствие чего загружаются эти классы. И так как все они содержат статические объекты Bowl, загружается класс Bowl. Таким образом, все классы программы загружаются до начала main(). Впрочем, эта ситуация нетипична, поскольку в рядовой программе не все поля объявляются как статические, как в данном примере.