Конструкции языка Java

Переменные и область видимости

Классы в Java содержат методы и поля – переменные класса. Методы имеют параметры, а внутри методов возможно определение локальных переменных. Требования к именам переменных – стандартные, как и в других языках программирования. Кроме того не допускается объявление переменных с одинаковыми именами. Так, например, следующий код будет считаться ошибочным.

int n;
{
     int n; // нельзя
}

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

В Java объявление локальных переменных возможно в любом месте метода. При этом областью видимости переменной будет тот блок, в котором она определена (под блоком подразумевается код, помещённый в фигурные скобки {}). Поэтому допустимо написать следующий код, т.к. у переменных n разные области видимости.

{
     int n;
}
int n; // можно

У параметров область видимости – весь метод. У полей область видимости – весь класс, однако возможно создавать локальные переменные с именем, совпадающим с именем поля. В этом случае после определения данное имя будет связано именно с переменной, а не с полем класса. Это крайне не рекомендуется делать, т.к. такое определение будет создавать некоторую двусмысленность восприятия кода и может способствовать появлению ошибок.

Стиль программирования

Создание легко и однозначно воспринимаемого кода является важным элементом в разработке программного обеспечения. Это упрощает работу и снижает количество возможных ошибок.

От программиста требуется:

Второе качество менее очевидно, но очень актуально при работе в команде.

Встречается большое число различных стилей программирования. В качестве примера приведём стиль, принятый для использования в Академии Borland.

Основные правила:

  1. имена классов пишутся с большой буквы;
  2. имена полей, методов, параметров, локальных переменных – с маленькой;
  3. по возможности не следует использовать сокращений в именах;
  4. имена, состоящие из нескольких слов, пишутся слитно, без использования знака подчёркивания, каждое слово с большой буквы. (Например: class HelloWorld) (Такое правило записи называется camelcase);
  5. Имена всех полей класса начинаются с префикса “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;