Область видимости переменных это часть программы где храняться переменные. Как и C/C++, в Java, все поля распределены по областям видимости, то есть область видимости переменных может быть определена на этапе компиляции.

С другой стороны, например Perl, поддерживает как динамическую область видимости, так и статическую. Ключевое слово my в Perl определяет статическую переменной в локальной области. Тем временем слово local определяет динамическую локальную переменную.

Java программа организована с помощью классов. Каждый класс является частью какого-либо пакета.

Правила областей видимости в Java может быть разделено на следующие категории:

Область видимости класса

Все переменные в этой области должны быть определены внутри класса (снаружи функций). Они могут быть доступны из любой области класса. Вот пример программы:

public class Test
{
    // All variables defined directly inside a class 
    // are member variables
    int a;
    private String b
    void method1() {....}
    int method2() {....}
    char c;
}

Мы можем определить переменную области видимости класса в любом месте класса, но снаружи методов. Указанный модификатор доступа для переменной в классе не дает никакого эффекта внутри класса. Переменные класса могут быть доступны за его пределом по следующим правилам:

Modifier Package Subclass World
public Yes Yes Yes
protected Yes Yes No
Default Yes No No
private No No No

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

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

public class Test
{
    void method1() 
    {
       // Local variable (Method level scope)
       int x;
    }
}

Заметка: Локальные переменные перестают существовать после того как метод отработает.

Вот другой пример переменных, определяемых в методе. В этом случае переменная метода передается в качестве параметра:

class Test
{
    private int x;
    public void setX(int x)
    {
        this.x = x;
    }
}

В этом примере ключевое слово this, обращается к переменной класса.

Область переменных в циклах и блоках

Переменные, которые заданные в блоках кода между скобками “{“ и “}”, в методе, существуют только в этом блоке.

public class Test
{
    public static void main(String args[])
    {
        {
            // The variable x has scope within
            // brackets
            int x = 10;
            System.out.println(x);
        }
         
        // Uncommenting below line would produce
        // error since variable x is out of scope.
 
        // System.out.println(x); 
    }
}

Вывод:

10

Вот еще один пример, который показывает что переменная доступна только в пределах блока while и снаружи уже не существует.

class Test
{
    public static void main(String args[])
    {
        for (int x=0; x < 4; x++)
        {
            System.out.println(x);
        }
 
        // Will produce error
        System.out.println(x);
    }
}

Вывод:

11: error: cannot find symbol
        System.out.println(x); 

Вот как нужно было сделать, чтобы это работало:

// Above program after correcting the error
class Test
{
    public static void main(String args[])
    {
        int x;
        for (x=0; x < 4; x++)
        {
            System.out.println(x);
        }
 
       System.out.println(x);
    }
}

Вывод:

0
1
2
3
4

Давайте посмотрим на пример трюка с циклом. Угадайте вывод это программы. Вы будете удивлены, если вы программист C/C++.

{
    public static void main(String args[])
    {
        int x = 5;
        for (int x = 0; x &lt; 5; x++)
        {
            System.out.println(x);
        }
    }
}

Вывод:

6: error: variable a is already defined in method go(int)
       for (int a = 0; a < 5; a++)       
                ^
1 error

Еще один пример, угадайте какой будет вывод:

class Test
{
    public static void main(String args[])
    {
        {
            int x = 5;
            {
                int x = 10;
                System.out.println(x);
            }
        }
    }
}

Некоторые важные вещи об области видимости переменных в Java:

  • Обычно, фигурные скобки определяют область видимости переменных
  • В Java мы можем использовать переменных до тех пор пока находимся в том же блоке между фигурными скобками, когда пишем Java код.
  • Любая переменная, которая задается в классе, за пределами методов, может быть доступна во всем классе.
  • Когда в метод определена переменная с таким же именем, что и переменная класса, мы можем получить доступ к переменной класса, используя ключевое слово this.
  • Чтобы получить доступ к переменной в цикле, эта переменная должна быть объявлена до начала цикла.

Эта статья является переводом этой статьи.