Кен Арнольд Джеймс Гослинг

Вид материалаДокументы

Содержание


5.6.1. Ссылки на объекты
5.6.2. Логические значения В типе boolean имеются два литерала — true и false. 5.6.3. Целые значения
5.6.4. Значения с плавающей точкой
5.7. Объявления переменных
5.7.1. Значение имени
Подобный материал:
1   ...   23   24   25   26   27   28   29   30   ...   81

5.6. Литералы


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

5.6.1. Ссылки на объекты


Для ссылок на объекты существует всего один литерал — null. Он может находиться всюду, где допускается использование ссылки. Чаще всего null представляет ссылку на недопустимый или несуществующий объект. null не относится ни к одному типу, даже к типу Object.

5.6.2. Логические значения


В типе boolean имеются два литерала — true и false.

5.6.3. Целые значения


Целые константы являются последовательностями восьмеричных, десятичных или шестнадцатеричных цифр. Начало константы определяет основание системы счисления: 0 (ноль) обозначает восьмеричное число (основание 8); 0x или 0X обозначает шестнадцатеричное число (основание 16); любой другой набор цифр указывает на десятичное число (основание 10). Следующие числа имеют одинаковое значение:

29 035 0x1D 0X1d

Целые константы относятся к типу long, если они заканчиваются символом L или l, как 29L; желательно пользоваться L, потому что l легко спутать с 1 (цифрой один). В противном случае считается, что целая константа относится к типу int. Если литерал типа int непосредственно присваивается переменной типа short или byte и его значение находится в пределах диапазона допустимых значений для типа переменной, то операции с литералом осуществляются так, словно он относится к типу short или byte соответственно.

5.6.4. Значения с плавающей точкой


Число с плавающей точкой представляется в виде десятичного числа с необязательной десятичной точкой, за которым (также необязательно) может следовать порядок. Число должно содержать как минимум одну цифру. В конце числа может стоять символ F или f для обозначения константы с одинарной точностью или же символ d или D для обозначения константы с двойной точностью. Следующие литералы обозначают одно и то же значение:

18. 1.8e1 .18E2

Константы с плавающей точкой относятся к типу double, если только они не завершаются символом f или F — в этом случае они имеют тип float, как константа 18.0f. Завершающий символ D или d определяет константу типа double. Ноль может быть положительным (0.0) или отрицательным (-0.0). Положительный ноль равен отрицательному, но при использовании в некоторых выражениях они могут приводить к различным результатам. Например, выражение 1d/0d равно +, а 1d/-0d равно –.

Константа типа double не может присваиваться переменной типа float, даже если ее значение лежит в пределах диапазона float. Для присваивания значений переменным и полям типа float следует использовать константы типа float или привести double к float.

5.6.5. Символы


Символьные литералы заключаются в апострофы — например, ‘Q’. Некоторые служебные символы могут представляться в виде escape-последовательностей. К их числу относятся:

\n переход на новую строку (\u000A)

\t табуляция (\u0009)

\b забой (\u0008)

\r ввод (\u000D)

\f подача листа (\u000C)

\\ обратная косая черта (\u005C)

\’ апостроф (\u0027)

\" кавычка (\u0022)

\ddd символ в восьмеричном представлении, где каждое d соответствует цифре от 0 до 7

Восьмеричные символьные константы могут состоять из трех или менее цифр и не могут превышать значения \377 (\u00ff). Символы, представленные в шестнадцатеричном виде, всегда должны состоять из четырех цифр.

5.6.6. Строки


Строковые литералы заключаются в двойные кавычки: “along”. В них могут входить любые escape-последовательности, допустимые в символьных константах. Строковые литералы являются объектами типа String. Более подробно о строках рассказывается в главе 8.

Символы перехода на новую строку не могут находиться в середине строковых литералов. Если вы хотите вставить такой символ в строку, воспользуйтесь escape-последовательностью \n.

В строках может применяться восьмеричная запись символов, но для предотвращения путаницы (в тех случаях, когда символы, представленные таким образом, соседствуют с другими символами) необходимо указывать все три восьмеричные цифры. Например, строка “\0116" эквивалентна строке ”\t6", тогда как строка “\116" эквивалентна ”N".

5.7. Объявления переменных


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

Модификаторы могут отсутствовать в объявлении переменной. Модификатор static объявляет, что переменная сохраняет свое значение после выхода из метода; модификатор final объявляет, что значение переменной присваивается всего один раз, при ее инициализации. Модификатор final может использоваться только для полей.

Тип в объявлении указывает на то, какие значения могут принимать объявляемые величины и как они должны себя вести.

Между объявлением переменной по отдельности или одновременно с несколькими другими переменными нет никаких различий. Например, объявление:

float[] x, y;

равносильно

float[] x;

float[] y;

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

Поля с модификатором final должны инициализироваться при объявлении.

Объявлению члена класса может предшествовать один из нескольких модификаторов. Модификаторы могут следовать в произвольном порядке, но мы рекомендуем выработать некоторое соглашение и придерживаться его. В этой книге используется следующий порядок: сначала следуют модификаторы доступа (public, private или protected), затем static, затем synchronized, и, наконец, final. Использование единого порядка модификаторов облегчает чтение исходного текста программы.

5.7.1. Значение имени


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

1. Локальные переменные, объявленные в блоке, цикле for или среди параметров обработчика исключений. Блок представляет собой один или несколько операторов, заключенных в фигурные скобки. Переменные также могут объявляться во время инициализации в цикле for.

2. Параметры метода или конструктора, если код входит в метод или конструктор.

3. Члены данного класса или интерфейсного типа, то есть его поля и методы, в том числе все унаследованные члены.

4. Импортированные типы с явным именованием.

5. Другие типы, объявленные в том же пакете.

6. Импортированные типы с неявным именованием.

7. Прочие пакеты, доступные в системе.

В каждом из вложенных блоков или операторов for могут объявляться новые имена. Чтобы избежать путаницы, вы не можете воспользоваться вложением для переобъявления параметра или идентификатора из внешнего блока или оператора for. Так, после появления локального идентификатора или параметра с именем über вы не можете создать во вложенном блоке новый, отличный от него идентификатор с тем же именем über.

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

class Reuse {

Reuse Reuse(Reuse Reuse) {

Reuse:

for (;;) {

if (Reuse.Reuse(Reuse) == Reuse)

break Reuse;

}

return Reuse;

}

}

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

Вложение областей видимости означает, что переменная существует лишь в том фрагменте программы, в котором планируется ее использование. Например, к переменной, объявленной при инициализации цикла for, невозможно обратиться за пределами цикла. Нередко это бывает полезно, чтобы код за пределами цикла for не смог определить, при каком значении управляющей переменной завершился цикл.

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