Перейти к основному содержимому

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

· 3 мин. чтения

1. Обзор

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

В этом руководстве мы познакомим вас с доступными областями действия в Java и обсудим различия между ними.

2. Область действия класса

Каждая переменная, объявленная внутри квадратных скобок класса ( {} ) с модификатором доступа private , но вне любого метода, имеет область действия класса. В результате эти переменные можно использовать везде в классе, но не вне его :

public class ClassScopeExample {
private Integer amount = 0;
public void exampleMethod() {
amount++;
}
public void anotherExampleMethod() {
Integer anotherAmount = amount + 4;
}
}

Мы видим, что ClassScopeExample имеет переменную класса amount , доступ к которой можно получить в методах класса.

Если мы не используем private , он будет доступен из всего пакета. Прочтите статью о модификаторах доступа для получения дополнительной информации.

3. Область применения метода

Когда переменная объявлена внутри метода, она имеет область действия метода и будет действительна только внутри того же метода:

public class MethodScopeExample {
public void methodA() {
Integer area = 2;
}
public void methodB() {
// compiler error, area cannot be resolved to a variable
area = area + 2;
}
}

В методе A мы создали переменную метода с именем area . По этой причине мы можем использовать область внутри метода A , но не можем использовать ее где-либо еще.

4. Объем цикла

Если мы объявим переменную внутри цикла, она будет иметь область действия цикла и будет доступна только внутри цикла:

public class LoopScopeExample {
List<String> listOfNames = Arrays.asList("Joe", "Susan", "Pattrick");
public void iterationOfNames() {
String allNames = "";
for (String name : listOfNames) {
allNames = allNames + " " + name;
}
// compiler error, name cannot be resolved to a variable
String lastNameUsed = name;
}
}

Мы видим, что метод iterationOfNames имеет переменную метода с именем name . Эта переменная может использоваться только внутри цикла и недействительна вне его.

5. Область применения кронштейна

Мы можем определить дополнительные области в любом месте, используя скобки ( {} ):

public class BracketScopeExample {    
public void mathOperationExample() {
Integer sum = 0;
{
Integer number = 2;
sum = sum + number;
}
// compiler error, number cannot be solved as a variable
number++;
}
}

Номер переменной действителен только в квадратных скобках.

6. Область видимости и затенение переменных

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

public class NestedScopesExample {
String title = "ForEach";
public void printTitle() {
System.out.println(title);
String title = "John Doe";
System.out.println(title);
}
}

В первый раз, когда мы печатаем title , будет напечатано «ForEach». После этого объявите одноименную переменную метода и присвойте ей значение «John Doe ».

Переменная метода title отменяет возможность повторного доступа к переменной title класса . Вот почему во второй раз он напечатает «John Doe » .

Сбивает с толку, верно? Это называется затенением переменных и не является хорошей практикой. Лучше использовать префикс this для доступа к переменной класса title , например this.title .

7. Заключение

Мы изучили различные области видимости, существующие в Java.

Как всегда, код доступен на GitHub .