— Привет, мой любимый ученик. Сейчас я расскажу тебе о видимости переменных.

— А что, бывают и невидимые переменные?

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

— Например, ты не можешь обратиться к переменной раньше, чем она объявлена.

— Логично.

— Вот несколько примеров:

┏
┃public class Variables
┃┏
┃┃{
┃┃   private static String TEXT = "The end.";
┃┃  ┗━━━━━━━━━━━━━━┛
┃┃   public static void main (String[] args)
┃┃ ┏                         ┗━━━━━━━┛
┃┃ ┃ {
┃┃ ┃    System.out.println("Hi");
┃┃ ┃    String s = "Hi!";
┃┃ ┃  ┏┗━━━━┛
┃┃ ┃  ┃ System.out.println(s);
┃┃ ┃  ┃ if (args != NULL)
┃┃ ┃  ┃ {
┃┃ ┃  ┃    String s2 = s;
┃┃ ┃  ┃   ┗━━━━┛
┃┃ ┃  ┃  ┏
┃┃ ┃  ┃  ┃ System.out.println(s2);
┃┃ ┃  ┃  ┗
┃┃ ┃  ┃ }
┃┃ ┃  ┃ Variables variables = new Variables();
┃┃ ┃  ┃ System.out.println(variables.classVariables);
┃┃ ┃  ┃ System.out.println(TEXT);
┃┃ ┃  ┗
┃┃ ┃ }
┃┃ ┗
┃┃   public String classVariables;
┃┃  ┗━━━━━━━━━━━━━━━┛
┃┃   public Variables()
┃┃   {
┃┃      classVariables = "Class Variables test.";
┃┃   }
┃┃}
┃┗
┗

1. Переменная, объявленная в методе, существует/видна с начала объявления до конца метода.

2. Переменная, объявленная в блоке кода, существует до конца этого блока кода.

3. Переменные — аргументы метода — существуют везде внутри метода.

4. Переменные класса/объекта существуют все время жизни содержащего их объекта. Их видимость дополнительно регулируется специальными модификаторами доступа: public, private.

5. Статические переменные классов существуют все время работы программы. Их видимость также определяется модификаторами доступа.

— Обожаю картинки, на них все всегда понятно.

— Молодец, Амиго. Всегда знал, что ты сообразительный малый.

— Еще расскажу тебе про «модификаторы доступа». Да не пугайся ты так, ничего сложного в них нет. Это слова public и private, которые ты видишь.

— А я и не пугаюсь – это у меня глаз дергается.

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

1 Модификатор «public».

К переменной, методу или классу, помеченному модификатором public, можно обращаться из любого места программы. Это самая высокая степень открытости — никаких ограничений нет.

2 Модификатор «private».

К переменной или методу, помеченному модификатором private, можно обращаться только из того же класса, где он объявлен. Для всех остальных классов помеченный метод или переменная — невидимы и «как бы не существуют». Это самая высокая степень закрытости – только свой класс.

3 Без модификатора.

Если переменная или метод не помечены никаким модификатором, то считается, что они помечены «модификатором по умолчанию». Переменные или методы с таким модификатором (т.е. вообще без какого-нибудь) видны всем классам пакета, в котором они объявлены. И только им. Этот модификатор еще иногда называют «package», намекая, что доступ к переменным и методам открыт для всего пакета, в котором находится их класс

Таблица с пояснением:

Модификаторы Доступ из…
Своего класса Своего пакета Любого класса
private Есть Нет Нет
нет модификатора (package) Есть Есть Нет
public Есть Есть Есть