Конструкции языка Java
Переменные и область видимости
Классы в Java содержат методы и поля – переменные класса. Методы имеют параметры, а внутри методов возможно определение локальных переменных. Требования к именам переменных – стандартные, как и в других языках программирования. Кроме того не допускается объявление переменных с одинаковыми именами. Так, например, следующий код будет считаться ошибочным.
int n; { int n; // нельзя }
У каждой переменной есть область видимости, т.е. та область программы, в которой возможна работа с этой переменной. Таким образом у переменных с одинаковыми именами не должны пересекаться области видимости.
В Java объявление локальных переменных возможно в любом месте метода. При этом областью видимости переменной будет тот блок, в котором она определена (под блоком подразумевается код, помещённый в фигурные скобки {}). Поэтому допустимо написать следующий код, т.к. у переменных n разные области видимости.
{ int n; } int n; // можно
У параметров область видимости – весь метод. У полей область видимости – весь класс, однако возможно создавать локальные переменные с именем, совпадающим с именем поля. В этом случае после определения данное имя будет связано именно с переменной, а не с полем класса. Это крайне не рекомендуется делать, т.к. такое определение будет создавать некоторую двусмысленность восприятия кода и может способствовать появлению ошибок.
Стиль программирования
Создание легко и однозначно воспринимаемого кода является важным элементом в разработке программного обеспечения. Это упрощает работу и снижает количество возможных ошибок.
От программиста требуется:
- наличие собственного стиля программированя;
- умение приспосабливаться к стилю программирования, принятому в компании.
Второе качество менее очевидно, но очень актуально при работе в команде.
Встречается большое число различных стилей программирования. В качестве примера приведём стиль, принятый для использования в Академии Borland.
Основные правила:
- имена классов пишутся с большой буквы;
- имена полей, методов, параметров, локальных переменных – с маленькой;
- по возможности не следует использовать сокращений в именах;
- имена, состоящие из нескольких слов, пишутся слитно, без использования знака подчёркивания, каждое слово с большой буквы. (Например: class HelloWorld) (Такое правило записи называется camelcase);
- Имена всех полей класса начинаются с префикса “my”. (Это делается для избежания совпадения с именем локальной переменной).
Правила 1-4 обусловлены оформлением стандартной библиотеки Javа. Правило 5 является просто всеобщей договорённостью, принятой в Академии.
Управляющие конструкции
Определение управляющих конструкций в Java практически во всём совпадает с C++.
Условные конструкции
Наиболее распространённой формой управляющих структур является конструкция if … else, синтаксис которой выглядит следующим образом:
if (БулевскоеВыражение) { Инструкции1 } else { Инструкции2 }
Сначала осуществляется проверка значения булевского
выражения. Если результат равен true, выполняется блок инструкций 1, в
противном случае (и при наличии предложения else
)
– блок инструкций 2.
Предложение else
может быть пропущено, при этом конструкция if
… else
принимает более краткий вид:
if (БулевскоеВыражение) { Инструкции }
В этом случае при ложном значении булевского выражения никаких операций не выполняется.
Возможна также и вложенность конструкций if … else
:
if (БулевскоеВыражение1) { Инструкции1 } else if (БулевскоеВыражение2) { Инструкции2 } else { Инструкции3 }
Некоторым аналогом конструкции if … else
является операция «?» со следующим синтаксисом:
БулевскоеВыражение ? Значение1 : Значение2
Где Значение1
,
Значение2
– вычисляемые значения
одного типа.
Результатом этой операции будет Значение1
, если БулевскоеВыражение
истинно, в противном случае – Значение2
Конструкция switch
позволяет передавать управление тому или иному блоку кода, обозначенному
именованой меткой, в зависимости от значения выражения.
switch (Выражение) { case n: Инструкции case m: Инструкции ... default: Инструкции }
Значение выражения может иметь один из типов: byte, short, int, char
. Каждой метке case
ставится в соответствие константа. Если значение выражения совпадает со
значением некоторой метки, управление передаётся первой инструкции, следующей
за меткой. Для выхода из конструкции после завершения инструкций блока
используется команда break
. Если
не прервать исполнение командой break
,
будет исполнятся блок инструкций, соответствующий следующему значению. Если
значение выражения не совпало ни с одной из меток, выполняется первая
инструкция блока default
. Если
же метка default
отсутствует,
выполнение switch
завершается.
Внутри конструкции switch
недопустимо обычное определение переменных, т.к. иначе обасть видимости этих
переменных будет пересекать остальные case-конструкции.
Хотя возможен вариант, когда переменная определяется внутру блока, целиком лежащего в пределах одной метки case. Например:
switch (charValue) { case 'A': return 1; case 'B': { int x = 5; x += 3; return x; } default: return 0; }
Циклы
Выражение for
применяется для организации циклического перехода по значениям из заданного
диапазаона и в общем виде выглядит так:
for (СекцияИнициализации;
БулевскоеВыражение; Секция изменения) Инструкция
.
Обработка цикла происходит в следующем порядке:
- инициализация
- проверка условия завершения
- исполнение тела цикла
- инкрементация счётчика
Все секции заголовка цикла for
являются необязательными. Если СекцияИнициализации
опускается, на её месте остаётся только символ точки с запятой. Если же из
заголовка исключается БулевскоеВыражение
,
в качестве значения логического условия подразумевается литерал true.
Исключение всех трёх секций приводит к тому, что цикл становится
«бесконечным»:
for (;;) { Инструкции }
Синтаксис циклической конструкции while выглядит так:
while (БулевскоеВыражение) Инструкция
Сначала осуществляется проверка булевского выражения. Если
результат равен true
,
выполняется Инструкция (в качестве инструкции может быть использован блок),
после чего булевское выражение проверяется вновь, и процесс повторяется до тех
пор, пока в результате проверки не будет получено значение false
.
Если требуется исполнить тело цикла хотя бы 1 раз,
используется конструкция do … while
:
do while (БулевскоеВыражение)
В этом случае проверка истинности логического выражения осуществляется после выполнения тела цикла.
В теле циклов возможно использовать две особые инструкции:
break
– применяется
для завершения выполнения цикла
continue
– передаёт
управление в конец тела цикла (т.е. начинает следующую итерацию). В ситуациях с
while
и do
это приводит к выполнению проверки условия цикла, а
при использовании в теле for
инструкция
continue
правоцирует передачу
управления секции изменения значения переменных цикла.
Отличия от С++
В Java отсутствует оператор goto
.
Но хотя программирование с применением goto
и считается плохим тоном, существуют задачи, в которых его использование очень
удобно. Основным примером такой ситуации является совершение выхода
одновременно из двух вложенных циклов.
Эта проблема решается в Java использованием меток. Любая инструкция в программе может быть снабжена меткой, которая представляет собой содержательное имя, позволяющее сослаться на соответствующую инструкцию.
метка: инструкция
Несмотря на то, что меткой может быть установлена перед
любой инструкцией, на практике имеет смысл применять метки только перед
циклическими конструкциями for, while, do
,
условными конструкциями if, switch
и блоками {}. Чтобы «выбраться» из вложенного цикла или блока, достаточно снабдить
меткой соответствующий внешний блок и указать её в команде break, которая
передаёт управление первой инструкции, следующей за блоком.
Примеры:
В данном случае break
осуществит выход сразу из двух циклов.
Ещё один пример выхода из сложной конструкции:
А следующий код тоже компилируем, однако лишён смысла.
lab_instruction: a = b + c; c = d + e;