JavaRush/Курсы/Java Syntax Pro/Нюансы работы с переменными

Нюансы работы с переменными

Открыта

1. Константы

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

Итак, как же объявить неизменяемую переменную (константу) в Java? Для этого есть специальное ключевое слово — final. Выглядит создание неизменяемой переменной так же, как и создание обычной, только перед типом переменной нужно написать слово final:

final тип имя = значение;

Если вы попытаетесь присвоить final-переменной другое значение, ваша программа просто не скомпилируется.

final-переменную обязательно нужно инициализировать при объявлении (присвоить ей значение). У этого правила есть одно исключение: можно перенести инициализацию переменной класса в конструктор. Но об этом вы узнаете на 10-м уровне.

Чтобы уменьшить количество ключевых слов, разработчики Java используют слово final не только для объявления констант. final также может быть указан перед методом и даже классом. Методы, объявленные как final, нельзя переопределять (override), а от класса, объявленного как final, нельзя наследоваться.

Модификатор final можно добавлять перед любыми переменными: локальными, параметрами, полями класса и статическими переменными.

Обратите внимание, что final — это всего лишь защита от изменения переменной. Если переменная хранит ссылку на объект, объект все-таки менять можно.

Пример:

final int[] data = {1, 2, 3, 4, 5, 6};

data = new int[]{6, 7, 8, 9};

data[0] = 0;
data[1] = 0;
data[2] = 0;
Создаем массив.

Так нельзя: переменная data объявлена как final.

А так можно.
И так можно.

Глобальные константы

Если вы решите объявить в своей программе глобальные константы, для этого нужно создать статические переменные класса, а также сделать их public и final. Для имен таких переменных существует специальный стиль написания: они пишутся заглавными буквами, а в качестве разделителя слов выступает символ подчеркивания.

Примеры:

class Solution
{
   public static final String SOURCE_ROOT = "c:\\projects\\my\\";
   public static final int DISPLAY_WIDTH = 1024;
   public static final int DISPLAY_HEIGHT = 768;
}


2. Затенение переменных

Как мы уже говорили раньше, нельзя в одном методе создать несколько локальных переменных с одинаковыми именами. В разных методах — можно.

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

Пример:

Код Доступность переменных
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     sum = sum + data;
     int sum = data * 2;
     count++;
   }
}


count
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum, data
count, sum

В методе add мы объявили локальную переменную sum, и она до конца действия метода перекрывает (или еще говорят затеняет) собой переменную класса sum.

Ну ок, скажете вы, даже в каком-то смысле ожидаемое поведение. Но это еще не все. Оказывается, если переменную класса затеняет локальная переменная, в методе все-таки существует способ обратиться к переменной класса. Для этого нужно перед ее именем написать ключевое слово this:

this.имя

Вот пример, где конфликт имен успешно решается:

Код Доступность переменных
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     this.sum = this.sum + data;
     count++;
   }
}


this.count
this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum, data
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum

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

Если затеняется не просто переменная класса, а статическая переменная класса, обращаться к ней нужно не через this, а через имя класса:

ClassName.имя

Пример:

Код Доступность переменных
public class Solution
{
   public static int count = 0;
   public static int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     Solution.sum = Solution.sum + data;
     count++;
   }
}

Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum, data
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum

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



3. Переменные внутри цикла for

И еще один маленький, но интересный факт.

Есть еще место, где особенным образом объявляется переменная — это цикл for.

Если вы помните, обычно у цикла for в круглых скобках объявляется переменная-счетчик. И какова же будет видимость этой переменной? Она ведь не находится в теле цикла — значит, весь метод? Или всё-таки нет?

Правильный ответ такой: переменная, объявленная в заголовке цикла for, видна только в теле цикла и в заголовке цикла for.

Пример:

Код Доступность переменных
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a

Поэтому вы всегда можете в своем коде последовательно написать несколько циклов с переменной-счетчиком с одинаковым именем — проблем не будет.

Пример:

Код Доступность переменных
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a, i
a, i
a, i
a
a
a



Комментарии (357)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
21 октября, 17:58
Я тут, после массивов норм 21.10.2026
Anatoly Chelushkin
Уровень 16
3 августа, 10:16
Вообще что то тяжело 7 урок прошел
Роман Брагин Уpoвень 40,5
5 июня, 07:51
05.06.2026 - 7 уровень
Anna Klushkina
Уровень 2
6 января, 09:36
⛏ 06.01.26 - 10 уровень
Роман Зарубин
Уровень 13
9 декабря 2025, 18:51
Работаем ...
Anonymous #3585174
Уровень 33
7 июня 2025, 06:53
like
Хэйли ЭвансQA Automation Engineer в солар
6 марта 2025, 11:21
Почему переменная "population" должна быть final если это ниразу не константа)
LisoEdoEdГлавный инженер-геодезист в ЗапСибГазпромStudent
12 марта 2025, 12:11
Зачем так заморачиваешься, Это всего лишь пример, задачка. Чтобы ты решила.
Хэйли ЭвансQA Automation Engineer в солар
12 марта 2025, 15:13
потому что обьясняется константа и на ее примере она таковой и должна являться, а вообще изза этой неточности вышло не с первого раза вот и бешусь :DD
LisoEdoEdГлавный инженер-геодезист в ЗапСибГазпромStudent
13 марта 2025, 09:43
В любом случает численность населения никогда не может быть константой)
Хэйли ЭвансQA Automation Engineer в солар
13 марта 2025, 19:18
ну так и я о том же)
Anonymous #3560516
Уровень 10
21 апреля 2025, 19:30
полностью тебя поддерживаю, вышло тоже самое и со мной
23 апреля 2025, 11:15
потому что джавараш дает такие примеры, которые заставляют не понять тему как можно быстрее, а помогают заморочиться и взбеситься)) Примеры на начальном уровне, как по мне, должны быть максимально лаконичные и понятные, чтобы у человека не пропадала мотивация от лишней когнитивной нагрузки.
Romaha Data Quality Analyst
25 мая 2025, 08:20
А в чём была неточность, из-за которой у вас не решилась задачка с первого раза?🙂 Вам ведь в ТЗ указали --> "Переменную population класса Earth нужно переделать в глобальную переменную". В нашем деле торопиться нельзя🙂
Diamond
Уровень 15
14 февраля 2025, 15:16
Почему я должен в переменную equatorLength ставить нижнее подчеркивание если в условие она без _ ?
Fend 1050
Уровень 2
16 февраля 2025, 11:12
Для имен таких переменных существует специальный стиль написания: они пишутся заглавными буквами, а в качестве разделителя слов выступает символ подчеркивания.
Амнистия Уровeнь 777
26 февраля 2025, 23:57
Где-то нам про это рассказывали? Тоже выбесило
Alexey Reutov
Уровень 17
2 марта 2025, 17:44
7 уровень, 6 лекция: 1.Константы: Глобальные константы (Почти в самом начале лекции)
Diamond
Уровень 15
14 февраля 2025, 14:49
Поставьте лайк если любите маму🤡
Юрий Frontend Developer
7 февраля 2025, 06:58
Ложки нет 🕶