JavaRush /Курсы /Java Syntax Pro /Видимость переменных

Видимость переменных

Java Syntax Pro
6 уровень , 4 лекция
Открыта

1. Локальные переменные

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

Все переменные, которые объявлены внутри методов, называются локальными переменными. Локальная переменная существует только в том блоке кода, в котором она объявлена. Или, если быть точнее, существует с момента объявления и до конца блока кода, в котором объявлена.

Давайте для простоты рассмотрим пример:

Код Доступность переменных
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     while (true)
     {
       int x = a + b;
       System.out.println(x);
     }
     System.out.println(b);
   }

}


a
a
a
a, b
a, b
a, b
a, b, x
a, b, x
a, b
a, b
a
a

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

Если переменную объявить в теле цикла, она и будет существовать только в теле цикла. Создаваясь и уничтожаясь на каждом витке цикла.

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

Пример:

Код Доступность переменных
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     System.out.println(b);
   }

   if (a < 20)
   {
     int b = 20;
     System.out.println(b);
   }
}


a
a
a
a, b
a, b
a
a
a
a
a, b
a, b
a

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


2. Переменные-параметры

Как мы уже раньше говорили, у каждого метода могут быть переменные-параметры. А что насчет их видимости и времени жизни?

Тут все довольно просто. Переменные-параметры создаются, когда управление передается в код метода (код метода начинает выполняться), и удаляются, когда работа метода завершается. Видны они во всем теле метода.

Пример:

Код Доступность переменных
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     while (true)
     {
       int x = a + b;
       System.out.println(x);
     }
     System.out.println(b);
   }

}

args
args, a
args, a
args, a
args, a, b
args, a, b
args, a, b
args, a, b, x
args, a, b, x
args, a, b
args, a, b
args, a
args, a

Как мы уже говорили ранее, args — это просто переменная типа массив строк. И как и все переменные-параметры, она доступна везде внутри тела метода. Хотя в наших примерах мы ее обычно игнорируем.



3. Переменные класса

Как вы помните из лекций 1-го уровня, класс может содержать функции и переменные. Функции при этом принято называть «методами класса», а переменные — «переменными класса» или «полями класса». Фактически в рамках Java это синонимы.

Что же такое переменные (или поля) класса?

Переменные класса — это переменные, объявленные не в методе, а в классе.

К ним можно обращаться из любого метода класса. Грубо говоря переменные класса — это общие переменные для всех методов класса.

Пример:

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

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

   public void remove(int data)
   {
     sum = sum - data;
     count--;
   }
}


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

В этом примере у нас есть два метода — add() и remove(). Метод add() увеличивает переменные класса sum и count, а метод remove() уменьшает переменные sum и count. Оба метода работают с общими переменными класса.

Локальные переменные существуют, пока выполняется метод. Переменные же класса существуют столько, сколько существует объект класса, к которому они принадлежат. Подробнее об объектах класса вы узнаете на следующем уровне.


4. Статические переменные

Переменные класса, как и методы класса, бывают статические и нестатические (обычные). Статические методы могут обращаться только к статическим переменным.

В 11-м уровне мы разберем устройство статических переменных и методов и поймем причины таких ограничений.

Чтобы сделать переменную класса статической, надо перед ее объявлением написать ключевое слово static.

Статические переменные привязаны не к объекту класса, в котором они объявлены, а к самому классу. Поэтому они существуют, даже если не создано ни одного объекта типа класса. Обращаться к ним из других классов можно с помощью конструкции вида:

ClassName.variableName

Пример:

Код Доступность переменных
public class Solution
{
   public void add(int data)
   {
     Storage.sum = Storage.sum + data;
     Storage.count++;
   }

   public void remove(int data)
   {
     Storage.sum = Storage.sum - data;
     Storage.count--;
   }
}

public class Storage
{
   public static int count = 0;
   public static int sum = 0;
}

Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum



Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum

В приведённом выше примере мы создали отдельный класс Storage, вынесли в него переменные count и sum и объявили их статическими. К публичным статическим переменным можно обращаться из любого метода программы (да и не только из метода).



Комментарии (228)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Игорь Лупац Уровень 16
3 октября 2025

public class Solution {
    public static String city = "Токио";
    public static double population = 34.5;
    
    public static String[] cities = {"Джакарта", "Сеул", "Дели", "Нью-Йорк"};
    public static double[] populations = {25.3, 25.2, 23.1, 21.6};
    
    public static int counter = 0;

    public static void main(String[] args) {
        for (int i = 0; i < cities.length; i++) {
          printCityPopulation(cities[counter], populations[counter]);
          counter++;  
        }
    }

    public static void printCityPopulation(String city, double population){

        
        System.out.println("Население города " + city + " составляет " + population + " млн человек.");
       
        city = Solution.city;
        population = Solution.population;
        
        System.out.println("В то время как в самом густонаселенном городе " + city + " население составляет " + population + " млн человек.");
    }
}

Не могу понять, что конкретно не проходит валидацию. Требования "Изменять имена переменных нельзя" и "Для вывода информации о самом крупном городе должны использоваться статические переменные класса city и population" прошли, а вот последнее требование - "Вывод программы в консоли должен соответствовать условию задачи" - не удовлетворяется. Хотя, вроде бы, вывод идентичен тому, что описано в условии.
Evgenii Petrov Уровень 10
26 октября 2025
Для вывода информации о самом крупном городе должны использоваться статические переменные класса city и population. Вот скорее всего из-за чего. + Solution.city + " население составляет "
Evgenii Petrov Уровень 10
26 октября 2025
Там же подсвечивает, в чем проблема?
yarikk Уровень 14
2 сентября 2025
2 задача решается простой сменой имен но так делать нам запрещают))
6 августа 2025
06.08.2025 - 7 уровень, жалею, что в далеком 2021 закончил учить на 2 уровне ((
Станислав Уровень 46
6 августа 2025
у тебя должно получиться в этот раз, даже когда непонятно продолжай, понимание придёт не сразу.
Anonymous #3585174 Уровень 33
7 июня 2025
like
Сергей Уровень 11
16 мая 2025
"Как вы помните из лекций 1-го уровня.." смешно)
Сергей Уровень 11
16 мая 2025
Начало 6.04.2025, 7 уровень, 5 лекция
Ivan Уровень 16
30 апреля 2025
начало 29.10.2022. 30.04.2025 7 уровень поставьте лайк, кто быстрее учится. спасибо торопыги раньше тут были интересные доп задачки про космос, но их убрали в 2024г.
Артем Уровень 11
12 апреля 2025
Объясните,пожалуйста ,если статические методы могут обращаться только к статическим переменным,то как в последнем примере у нас нестатитечский метод обращается к статическим переменным класса? У нас же public void add,а должен быть static
Артем Уровень 11
12 апреля 2025
дошло до меня: нестатический метод может обращаться к статическим переменным))
Дени Ахмадов Уровень 18
18 апреля 2025
Да, к статическим ПУБЛИЧНЫМ переменным класса. К ним можно обращаться из любых методов и не только.
Рифати Уровень 61
4 апреля 2025
Спасибо GPT и ответам, а то на на первом задании на циклах закончилась бы уже моя учеба🙂
Anonymous #3570450 Уровень 9
1 июня 2025
аналогично
Anonymous #3539491 Уровень 7
23 марта 2025
Я правильно обратился к статическим переменным класса Solution: имя_класса.имя_переменной. - в 20-ой строке. И задача решилась.