Читаем Философия Java3 полностью

Явная инициализация статических членов

Язык Java позволяет сгруппировать несколько действий по инициализации объектов static в специальной конструкции, называемой статическим блоком. Выглядит это примерно так:

// initialization/Spoon.java public class Spoon { static int i, static {

i = 47,

}

} ///:-

Похоже на определение метода, но на самом деле мы видим лишь ключевое слово static с последующим блоком кода. Этот код, как и остальная инициализация static, выполняется только один раз: при первом создании объекта этого класса или при первом обращении к статическим членам этого класса (даже если объект класса никогда не создается). Например:

II- initialization/ExplicitStatic java

II Явная инициализация с использованием конструкции "static"

import static net.mindview util.Print *;

class Cup {

CupCint marker) {

print("Cup(" + marker + ")"),

}

void f(int marker) {

printC'fC + marker + ")"),

}

}

class Cups {

static Cup cupl, static Cup cup2; static {

cupl = new Cup(l); cup2 = new Cup(2);

}

Cups О {

printCCupsO");

}

}

public class ExplicitStatic {

public static void main(String[] args) { printCInside mainO"); Cups.cupl.f(99); II (1)

}

II static Cups cupsl = new CupsO; II (2) II static Cups cups2 = new CupsO, II (2)

} /* Output: Inside mainO Cup(l) Cup(2) f (99) *///:-

Статический инициализатор класса Cups выполняется либо при обращении к статическому объекту cl в строке с пометкой (1), либо если строка (1) закомментирована — в строках (2) после снятия комментариев. Если же и строка (1), и строки (2) закомментированы, static-инициализация класса Cups никогда не выполнится. Также неважно, будут ли исполнены одна или обе строки (2) программы — static-инициализация все равно выполняется только один раз.

Инициализация нестатических данных экземпляра

В Java имеется сходный синтаксис для инициализации нестатических переменных для каждого объекта. Вот пример: .

// initialization/Mugs java // "Инициализация экземпляра" в Java import static net mindview util.Print *.

class Mug {

Mug(int marker) {

print("Mug(" + marker + ")");

}

void f(int marker) {

print("f(" + marker + ")");

}

}

public class Mugs { Mug mugl.

Mug mug2, {

mugl = new Mug(l); mug2 = new Mug(2).

print("mugl & mug2 инициализированы");

}

Mugs О {

print("Mugs()");

}

Mugs(int i) {

print("Mugs(int)"),

}

public static void main(String[] args) { printC'B методе mainO"); new Mugs О,

print("new Mugs О завершено"), new Mugs(l),

print("new Mugs(l) завершено");

}

} /* Output. В методе mainO Mug(l)

Mug(2) продолжение &

mugl & mug2 инициализированы Mugs О

new Mugs О завершено

Mug(1)

Mug(2)

mugl & mug2 инициализированы Mugs(int)

new Mugs(l) завершено *///:-

Секция инициализации экземпляра

{

mugl = new Mug(l);

mug2 = new Mug(2);

print("mugl & mug2 инициализированы");

}

выглядит в точности так же, как и конструкция static-инициализации, разве что ключевое слово static отсутствует. Такой синтаксис необходим для поддержки инициализации анонимных внутренних классов (см. главу 9), но он также гарантирует, что некоторые операции будут выполнены независимо от того, какой именно конструктор был вызван в программе. Из результатов видно, что секция инициализации экземпляра выполняется раньше любых конструкторов.

Инициализация массивов

Массив представляет собой последовательность объектов или примитивов, относящихся к одному типу, обозначаемую одним идентификатором. Массивы определяются и используются с помощью оператора индексирования [ ]. Чтобы объявить массив, вы просто. указываете вслед за типом пустые квадратные скобки:

int[] al;

Квадратные скобки также могут размещаться после идентификатора, эффект будет точно таким же:

int al[];

Это соответствует ожиданиям программистов на С и С++, привыкших к такому синтаксису. Впрочем, первый стиль, пожалуй, выглядит более логично — он сразу дает понять, что имеется в виду «массив значений типа int». Он и будет использоваться в книге.

Компилятор не позволяет указать точный размер массива. Вспомните, что говорилось ранее о ссылках. Все, что у вас сейчас есть, — это ссылка на массив, для которого еще не было выделено памяти. Чтобы резервировать память для массива, необходимо записать некоторое выражение инициализации. Для массивов такое выражение может находиться в любом месте программы, но существует и особая разновидность выражений инициализации, используемая только в точке объявления массива. Эта специальная инициализация выглядит как набор значений в фигурных скобках. Выделение памяти (эквивалентное действию оператора new) в этом случае проводится компилятором. Например:

int[] al = { 1, 2. 3, 4. 5 }.

Но зачем тогда вообще нужно определять ссылку на массив без самого массива?

int[] а2,

Во-первых, в Java можно присвоить один массив другому, записав следующее:

а2 = al,

В данном случае вы на самом деле копируете ссылку, как показано в примере:

// initialization/ArraysOfPrimitives.java

// Массивы простейших типов.

import static net mindview.util.Print.*;

public class ArraysOfPrimitives {

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных