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

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

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

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

— Приветствую, мой любимый ученик! Пришла пора немного серьезнее разобраться в переменных. Но в этот раз обсудим не их внутреннее устройство, а взаимодействие переменных с кодом, в котором они находятся.

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

— Мне явно нужен пример.

— Нет проблем. Лови:

Код Доступность переменных
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.

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

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

— Хм… Я завис...

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

— То есть они видны во всем теле метода и только там?

— Да. Пример:

Код Доступность переменных
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 — это просто переменная типа массив строк. И как и все переменные-параметры, она доступна везде внутри тела метода. Хотя в наших примерах мы ее обычно игнорируем.

7
Задача
Java Syntax Pro, 7 уровень, 6 лекция
Недоступна
Вспоминаем геометрию
Вспоминаем геометрию

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

— Вспомни лекции 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. Оба метода работают с общими переменными класса.

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

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

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

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

— Со статическими переменными пока всё не очень ясно.

— Понимаю, но ты не переживай. Пока привыкай к ним, присматривайся. На 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 и объявили их статическими. К публичным статическим переменным можно обращаться из любого метода программы (да и не только из метода).

— Хоть и не до конца понимаю, но мне это кажется удобным.

— Так и есть. А иногда это — необходимо, и без “статиков” мы никуда не продвинемся.

— Надеюсь, я постепенно разберусь с ними.

— Да куда ж ты денешься.

7
Задача
Java Syntax Pro, 7 уровень, 6 лекция
Недоступна
Все, что нужно знать о Земле
Все, что нужно знать о Земле
7
Задача
Java Syntax Pro, 7 уровень, 6 лекция
Недоступна
Учет работников
Учет работников
Комментарии (18)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Seven Уровень 21
13 мая 2023
Доброго времени суток! Коллеги, а можно же и так реализовать?

public class Storage{
    public static String city = "Токио";
    public static double population = 34.5;
    }
Или такое решение не совсем корректно?
Goodislav Уровень 24
24 декабря 2023
"Статические переменные привязаны не к объекту класса, в котором они объявлены, а к самому классу. Поэтому они существуют, даже если не создано ни одного объекта типа класса. Обращаться к ним из других классов можно с помощью конструкции вида: ClassName.variableName" Получается, что да.
zero to hero Уровень 44
1 марта 2023
В этой лекции меня смутило противоречие. "Статические методы могут обращаться только к статическим переменным" и в примере методы, в которых отсутствует ключевое слово static.
balakabaldon Уровень 19
17 марта 2023
перечитай внимательно, тут сказано, что статические методы могут обращаться только к статическим переменным, а это же не статические методы, они то могут обращаться к любым переменным
zero to hero Уровень 44
18 марта 2023
Да, спасибо. На этой лекции мне было все непонятно, на следующих уровнях более развернутые объяснения приводятся.
Анна Пигуедрам Уровень 13
21 октября 2022
мне все нравится. но постоянно присутствует чувство "а почему всё так легко?" и "где подвох?". Амиги высших уровней, подскажите, это норма? Когда начнется треш?))
hidden #2936288 Уровень 11
16 декабря 2022
Трешак начнется тогда, когда вы будете работать над реальным и большим проектом))
Alexander Уровень 2
5 февраля 2023
Для меня подвох начался в книге Кэти Сьерры "Head first Java" на теме generics(обобщения) =\ Интересно, тут будут затронуты или нет...
NextGenSeafarer Уровень 1
3 мая 2022
— Хоть и не до конца понимаю, но мне это кажется удобным. "Как я прохожу весь курс Java Rush" 🤖
Benjam1nBTN Уровень 24
21 июля 2022
И дальше: "...работаю джуном/мидлом/сеньором"
Aлександр 52 Уровень 21
15 ноября 2022
Недаром поговаривают, что у многих программистов развит синдром самозванца))
FuryCydonian Уровень 22
21 января 2022
Мы на первом уровне проходили массивы, а не классы. Почему здесь понамешаны уровни черти как и видимо еще не исправлено содержание уроков в связи с изменением порядка тем))
Alexey Уровень 15
11 января 2022
Почему так мало комментариев?
xseiter Уровень 11
30 апреля 2021

— Да куда ж ты денешься.
я надеюсь на это........
Сергей Уровень 1 Expert
25 февраля 2021
В контексте описания в лекции имеются ввиду статические переменные класса, а к ним можно получить доступ из любого метода
Nurbek Sandibekov Уровень 28
1 мая 2021
вам тут ответили(внизу)!
Jh-007 Уровень 28
14 декабря 2020
"Для начала, к ним можно обращаться из любого метода класса. Грубо говоря переменные класса — это общие переменные для всех методов класса." я бы здесь уточнил, пока не создан экземпляр класса, не выделена память для таких переменных. и обращаться к таким переменным нельзя. класс - это описание, а экземпляр класса - объект в памяти. это с точки зрения чистого ООП.
hidden #2402045 Уровень 16
18 августа 2020
падеж слова выполняются "— Я всё понял! Локальные переменные существуют, пока выполняются метод...