Переменные — Основы Java
Представьте себе задачу — нужно напечатать на экран фразу Father! два раза. Эту задачу можно решить в лоб:
В простейшем случае так и стоит поступить, но если фраза Father! начнет использоваться чаще, да еще и в разных частях программы, то придется ее везде повторять. Проблемы с таким подходом начнутся тогда, когда понадобится изменить нашу фразу, а такое происходит довольно часто. Нам придется найти все места, где использовалась фраза Father! и выполнить необходимую замену. А можно поступить по-другому. Вместо копирования нашего выражения, достаточно создать переменную с этой фразой:
Код выше состоит из таких компонентов:
В строчке var greeting = "Father!" происходит присваивание значения "Father!" переменной с именем greeting .
Когда переменная создана, можно начать ее использовать. Она подставляется в те места, где раньше стояла наша фраза. Во время выполнения кода в строке System.out.println(greeting) вместо переменной подставляется ее содержимое, а затем выполняется код. В результате вывод нашей программы будет таким:
Для имени переменной используется любой набор допустимых символов, к которым относятся буквы английского алфавита, цифры, знаки — и _ . При этом цифру нельзя ставить в начале. Имена переменных регистрозависимы, то есть имя hello и имя heLLo — это два разных имени и две переменные. Ниже пример с двумя разными переменными:
Для удобства анализа программы переменные принято создавать как можно ближе к тому месту, где они используются.
Изменение переменной
Само слово «переменная» говорит, что ее можно менять, так как с течением времени внутри программы значения переменных могут изменяться:
Java — статически типизированный язык. Это значит, что тип переменной задается при определении и больше не меняется.
В примере выше мы присвоили строку при создании переменной. Компилятор запоминает тип и проверяет все последующие изменения переменной. Если попробовать этой же переменной присвоить число, то мы получим следующую ошибку:
Компилятор делает такую проверку без запуска кода на выполнение, именно поэтому такой вид типизации называют статическим. В JavaScript, Ruby, PHP, Python и других динамических языках подобное поведение не является ошибкой, переменная может легко изменить свой тип в процессе работы.
Ошибки при работе с переменными
Порядок инструкций в коде с переменными имеет огромное значение. Переменная должна быть определена до того, как будет использована. Ниже пример ошибки, которую очень часто допускают новички:
Запуск программы выше завершается с ошибкой:
Ошибка cannot find symbol означает, что в коде используется переменная, которая не определена. Причем в самой ошибке об этом говорят прямо: variable greeting .
Кроме неправильного порядка определения, еще встречаются банальные опечатки, причем как при использовании переменной, так и при ее объявлении.
Еще одна распространенная ошибка — попытаться объявить уже объявленную переменную:
Так делать нельзя. Придется создать новую переменную.
Количество подобных ошибок уменьшается за счет использования правильно настроенного редактора. Такой редактор подсвечивает имена, которые используются без объявления, и предупреждает о возможных проблемах.
Выражения в определениях
Переменные полезны не только для хранения и переиспользования информации, но и для упрощения сложных вычислений.
Давайте рассмотрим пример: нужно перевести евро в рубли через доллары. Подобные конвертации через промежуточную валюту часто делают банки при покупках за рубежом.
Для начала переведем 50 евро в доллары. Допустим, что один евро — 1.25 доллара:
В предыдущем блоке мы записывали в переменную конкретное значение. А здесь справа от знака равно находится выражение:
Программа вычислит результат 62.5 и запишет его в переменную. С точки зрения программы не важно, что написано: 62.5 или 50 * 1.25. Оба варианта — выражения, которые надо вычислить. И они вычисляются в одно и то же значение 62.5.
Любая строка — выражение. Причем и конкатенация строк — тоже выражение. Когда программа видит выражение, она вычисляет его и возвращает результат.
Вот несколько примеров выражений. В комментариях справа от каждого выражения записано итоговое значение:
В тех местах, где ожидается выражение, можно поставить любое вычисление — так работают правила построения кода. Причем вычисление может быть не только математическое, но и строковое — например, конкатенация. При этом программа останется работоспособной.
По этой причине невозможно описать и показать все случаи использования всех операций. Программы состоят из множества комбинаций выражений, и понимание этой концепции — один из ключевых шагов на вашем пути.
Вернемся к нашей валютной программе. Запишем стоимость доллара в рублях, как отдельную переменную. Вычислим цену 50 евро в долларах, умножив их на 1.25. Допустим, что 1 доллар — 60 рублей:
А теперь давайте добавим к выводу текст с помощью конкатенации:
Любая переменная может быть частью любого выражения. В момент вычисления вместо имени переменной подставляется ее значение. Значение dollarsCount вычисляется до того, как она начнет использоваться в других выражениях. Когда подходит момент использования переменной, Java знает значение, потому что уже вычислил его.
Переменные и конкатенация
Переменные и конкатенацию можно объединять. Синтаксически ничего не меняется, ведь мы умеем конкатенировать — то есть склеивать две строки:
Значит, мы сумеем конкатенировать строку и одну переменную, в которой записана строка:
Можно даже конкатенировать две переменные, в которых записаны строки:
Константы
Некоторые данные никогда не меняются — например, математические постоянные. Возьмем число π. Приближенно оно всегда равно 3.14 и не может измениться.
Для обращения к подобным данным в Java принято использовать константы:
В отличие от переменных, в начале определения константы используют ключевое слово final . Оно сообщает компилятору запрет на изменение. Любая попытка поменять константу приведет к ошибке.
Константы принято именовать буквами в верхнем регистре с _ в качестве разделителя. Константа, как и переменная, может использоваться в любом выражении. Единственное ограничение — константу нельзя изменить, что звучит довольно логично.
Константа Java

В этой статье будет представлена тема константы Java. Постоянное значение — это значение, которое нельзя изменить после его назначения. В Java зарезервировано слово const , но оно не предоставляет никаких функций для реализации и использования констант. Но есть и другие способы использования констант, например, использование ключевых слов static и final , которые мы увидим в следующих примерах.
Объявление и использование констант с использованием ключевых слов private , static и final в Java
В первом примере мы используем два ключевых слова — static и final с модификатором доступа private . У нас есть класс, внутри которого объявлена и инициализирована константа MIN_VOTING_AGE .
Мы просим пользователя ввести свой возраст, чтобы проверить право на участие в голосовании. Как только пользователь вводит возраст, мы проверяем, не превышает ли он константу MIN_VOTING_AGE . Затем он показывает соответствующий результат в соответствии с условием.
Ключевое слово private гарантирует, что константа недоступна за пределами класса.
Java: Константы
Некоторые данные никогда не меняются — например, математические постоянные. Возьмем число π. Приближенно оно всегда равно 3.14 и не может измениться.
Для обращения к подобным данным в Java принято использовать константы:
В отличие от переменных, в начале определения константы используют ключевое слово final . Оно сообщает компилятору запрет на изменение. Любая попытка поменять константу приведет к ошибке.
Константы принято именовать буквами в верхнем регистре с _ в качестве разделителя. Константа, как и переменная, может использоваться в любом выражении. Единственное ограничение — константу нельзя изменить, что звучит довольно логично.
Задание
Создайте константу DRAGONS_BORN_COUNT и запишите в неё число 3 — это количество драконов, родившихся у Дайенерис. Выводить значение на экран не требуется.
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Pro Java
Мы уже и использовали переменные в наших примерах, поскольку без них было бы очень затруднительно объяснить примитивные типы данных в Java, но не акцентировали на этом внимания, так как это не большая и не сложная тема. О константах в Java мы вообще пока не говорили. И вот настало время! Ну погнали!
Переменная — основной компонент хранения данных в Java-программе. Переменная определяется комбинацией идентификатора, типа и необязательного начального значения. Кроме того, все переменные имеют область определения, которая задает их видимость для других объектов и время существования .
В Java все переменные должны быть объявлены до их использования. Объявить переменную можно в любом месте программы. Основная форма объявления переменных выглядит следующим образом:
тип идентификатор [=значение][, идентификатор [=значение] . ] ;
- тип — это один из элементарных типов Java либо имя класса или интерфейса.
- идентификатор — это имя переменной
Переменной можно присвоить начальное значение (инициализировать ее), указывая знак равенства и значение. Следует помнить, что выражение инициализации должно возвращать значение того же (или совместимого) типа, который указан для переменной. Для объявления более одной переменной указанного типа можно использовать список с разделителями-запятыми.
Несколько примеров объявления переменных различных типов приведено ниже. Обратите внимание, что некоторые объявления осуществляют инициализацию переменных.
int a , b , c ; // объявление трех переменных типа int: a, b и c
int d = 3 , e , f = 5 ; // объявление еще трех переменных типа int с инициализацией d и f
byte z = 22 ; // инициализация переменной z
double pi = 3.14159 ; // объявление приблизительного значения переменной pi
char x = ‘x’ ; // присваивание значения ‘x’ переменной x
Использовать неинициализированную переменную в выражениях нельзя, поэтому переменную надо инициализировать либо при ее объявлении, либо до ее использования в каком либо выражении. Например, приведенный ниже фрагмент кода будет признан ошибочным уже на этапе компиляции.
int vacationDays ;
System . out . println ( vacationDays ) ; // ОШИБКА! Переменная не инициализирована
Динамическая инициализация переменных
Java допускает динамическую инициализацию переменных посредством любого выражения, допустимого в момент объявления переменной. Например:
double a = 3.0 , b = 4.0 ;
// динамическая инициализация переменной c
double c = Math . sqrt ( a * a + b * b ) ;
System . out . println ( «Гипотенуза равна » + c ) ;
Область действия и время существования переменных
Это достаточно важный вопрос и его надо рассмотреть поподробнее. И для этого сперва надо рассмотреть использование блоков кода в Java.
Использование блоков кода
Java позволяет группировать один и более оператора в блоки кода, называемые также кодовыми блоками. Это выполняется путем помещения операторов в фигурные скобки. Сразу после создания блок кода становится логическим модулем, который можно использовать в тех же местах, что и отдельный оператор. Например, блок может служить в качестве цели для операторов if и for. Рассмотрим следующий оператор if:
if ( x < y ) < // начало блока
x = y;
y = 0 ;
> // конец блока
В этом примере, если x меньше y, программа выполнит оба оператора, расположенные внутри блока. Таким образом, оба оператора внутри блока образуют логический модуль, и выполнение одного оператора невозможно без одновременного выполнения и второго. Основная идея этого подхода состоит в том, что во всех случаях, когда требуется логически связать два или более оператора, это делается посредством создания блока.
Java допускает объявление переменных внутри любого блока. Блок начинается открывающей фигурной скобкой и завершается закрывающей фигурной скобкой. Блок задает область определения. Таким образом, приоткрытии каждого нового блока мы создаем новую область действия. Область действия задает то, какие объекты видимы другим частям программы. Она определяет также время существования этих объектов.
Основное правило, которое следует запомнить: переменные, объявленные внутри области действия, не видны (т.е. недоступны) коду, который находится за пределами этой области. Таким образом, объявление переменной внутри области действия ведет к ее локализации и защите от несанкционированного доступа и/или изменений.
Области действия могут быть вложенными . Например, при каждом создании блока кода мы создаем новую, вложенную область действия. В этих случаях внешняя область действия заключает в себя внутреннюю область . Это означает, что объекты, объявленные во внешней области, будут видны коду, определенному во внутренней области . Тем не менее, обратное не верно. Объекты, которые объявлены во внутренней области действия, не будут видны за ее пределами . Это может пояснить следующий пример:
![]()
Переменная y, определенная внутри своей области действия ограниченной фигурными скобками, доступна только в ней. За ее пределами переменная y уже не доступна, а переменная x доступна, и во области действия переменной y.
Следует запомнить еще один важный нюанс: переменные создаются при входе в их область действия и уничтожаются при выходе из нее.
Это означает, что переменная утратит свое значение сразу по выходу из области действия.
![]()
Хотя блоки могут быть вложенными, во внутреннем блоке нельзя объявлять переменные с тем же именем, что и во внешней области .
Код приведенный на примере слева, выдаст ошибку компиляции.
Такие трюки возможные в C и C++ в Java не проходят.
Константы в Java
В Java для обозначения констант служит ключевое слово final. Ключевое слово final означает, что присвоить данной переменной какое-нибудь значение можно лишь один раз, после чего изменить его уже нельзя. Рекомендуется использовать для именования констант прописные буквы, хоть это и не является обязательным, но такой стиль способствует удобочитаемости кода. Пример объявления константы:
final double CM_PER_INCH = 2.54 ;
Константу можно и не инициализировать при ее объявлении, но необходимо инициализировать до ее использования в каком-либо выражении, точно так же как и переменную, но сделать это можно только один раз. Причем это можно сделать и в условных операторах, то есть инициализировать значение константы в зависимости от каких либо условий. Компилятор проверит все возможные варианты, и если будет хоть один, где константа может быт не инициализирована, то он выдаст ошибку.