Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GoslingJava2.doc
Скачиваний:
139
Добавлен:
23.02.2016
Размер:
2.39 Mб
Скачать

5.9. Инициализация

Переменная может инициализироваться при ее объявлении. Чтобы задать начальное значений переменной, следует после ее имени поставить = и выражение:

final double p = 3.14159;

float radius = 1.0f; // начать с единичного радиуса

Если при объявлении поля класса не инициализируются, то Java присваивает им исходные значения по умолчанию. Значение по умолчанию зависит от типа поля:

Тип поля

Тип поля

boolean

false

char

‘\u0000’

целое (byte, short, int, long)

0

с плавающей точкой

+0.0f или +0.0d

ссылка на объект

null

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

Момент инициализации переменной зависит от ее области видимости. Локальные переменные инициализируются каждый раз, когда выполняется их объявление. Поля объектов и элементы массивов инициализируются при создании объекта или массива оператором new— см.“Порядок вызова конструкторов”. Инициализация статических переменных класса происходит перед выполнением какого-либо кода, относящегося к данному классу.

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

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

Чтобы инициализировать массив, следует задать значения его элементов в фигурных скобках после его объявления. Следующее объявление создает и инициализирует объект-массив:

String[] dangers = { "Lions", "Tigers", "Bears" };

Это равносильно следующему фрагменту:

String[] dangers = new String[3];

dangers[0] = "Lions";

dangers[1] = "Tigers";

dangers[2] = "Bears";

Для инициализации многомерных массивов может использоваться вложение инициализаторов отдельных массивов. Приведем объявление, в котором инициализируется матрица размеров 4x4:

double[][] identityMatrix = {

{ 1.0, 0.0, 0.0, 0.0 },

{ 0.0, 1.0, 0.0, 0.0 },

{ 0.0, 0.0, 1.0, 0.0 },

{ 0.0, 0.0, 0.0, 1.0 },

};

5.10. Приоритет и ассоциативность операторов

Приоритетом (precedence) оператора называется порядок, в котором он выполняется по отношению к другим операторам. Различные операторы имеют различные приоритеты. Например, приоритет условных операторов выше, чем у логических, поэтому вы можете написать

if (i >>= min && i <<= max)

process(i);

не сомневаясь в порядке выполнения операторов. Поскольку * (умножение) имеет более высокий приоритет, чем— (вычитание), значение выражения

5 * 3— 3

равно 12, а не нулю. Приоритет операторов можно изменить с помощью скобок; например, если бы в предыдущем выражении вам было нужно получить именно ноль, то для этого достаточно поставить скобки:

5 * (3— 3)

Когда два оператора с одинаковыми приоритетами оказываются рядом, порядок их выполнения определяется ассоциативностью операторов. Поскольку + (сложение) относится к лево-ассоциативным операторам, выражение

a + b + c

эквивалентно следующему:

(a + b) + c

Ниже все операторы перечисляются в порядке убывания приоритетов. Все они являются бинарными, за исключением унарных операторов, операторов создания и преобразования типа (также унарных) и тернарного условного оператора. Операторы с одинаковым приоритетом приведены в одной строке таблицы:

постфиксные операторы

[] . (параметры) expr++ expr—

унарные операторы

++expr —expr +expr -expr ~ !

создание и преобразование типа

new (тип)expr

операторы умножения/деления

* / %

операторы сложения/вычитания

+ -

операторы сдвига

<< >> >>>

операторы отношения

< > >= <= instanceof

операторы равенства

== !=

поразрядное И

&

поразрядное исключающее ИЛИ

^

поразрядное включающее ИЛИ

|

логическое И

&&

логическое ИЛИ

||

условный оператор

?:

операторы присваивания

= += -= *= /= %= >>= <<= >>>= &= ^= |=

Все бинарные операторы, за исключением операторов присваивания, являются лево-ассоциативными. Операторы присваивания являются право-ассоциативными— другими словами, выражение a=b=c эквивалентно a=(b=c).

Приоритет может изменяться с помощью скобок. В выражении x+y*z сначала y умножается на z, после чего к результату прибавляется x, тогда как в выражении (x+y)*z сначала вычисляется сумма x и y, а затем результат умножается на z.

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

while ((v = stream.next()) != null)

processValue(v);

Приоритет операторов присваивания ниже, чем у операторов равенства; без скобок наш пример был бы равносилен следующему:

while (v = (stream.next() != null)) // НЕВЕРНО

processValue(v);

что, вероятно, отличается от ожидаемого порядка вычислений. Кроме того, конструкция без скобок, скорее всего, окажется неверной— она будет работать лишь в маловероятном случае, если v имеет тип boolean.

Приоритет поразрядных логических операторов &, ^ и | также может вызвать некоторые затруднения. Бинарные поразрядные операторы в сложных выражениях тоже следует заключать в скобки, чтобы облегчить чтение выражения и обеспечить правильность вычислений.

В этой книге скобки употребляются довольно редко— лишь в тех случаях, когда без них смысл выражения будет неочевидным. Приоритеты операторов являются важной частью языка и их нужно знать. Многие программисты склонны злоупотреблять скобками. Старайтесь не пользоваться скобками там, где без них можно обойтись— перегруженная скобками программа становится неудобочитаемой и начинает напоминать LISP, не приобретая, однако, ни одного из достоинств этого языка.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]