Вопрос-ответ

What is 'scope' in Java?

Что такое "scope" в Java?

Я только начал кодировать. Я хочу использовать оператор switch дважды для одной и той же переменной, и мне сказали, что для этого переменная должна быть "в области видимости".

Будучи новичком, я понятия не имею, что это значит. Итак, что означает быть в scope? И, если переменная не находится в scope, как мне сделать ее в scope?

Переведено автоматически
Ответ 1

Локальная переменная1 находится "в области видимости", если код может получить к ней доступ, и вне области видимости, если нет. В Java переменные ограничены блоком ({}), в котором они объявлены. Итак:

void foo() {
int a = 42;

if (/*some condition*/) {
String q = "Life, the Universe, and Everything";

// 1. Both `a` and `q` are in scope here
System.out.println(a);
System.out.println(q);
if (/*another condition*/) {
// 2. Both `a` and `q` are in scope here, too
System.out.println(a);
System.out.println(q);
}
}

// 3. Only `a` is in scope here
System.out.println(a);
System.out.println(q); // ERROR, `q` is not in scope
}

Примечание (1), (2) и (3) выше:


  1. Код может получить доступ, q потому что q объявлен в том же блоке, что и код; tt может получить доступ, a потому что он объявлен в содержащем блоке.


  2. Код может получить доступ, q потому что он объявлен в содержащем блоке; он может получить доступ, a потому что он находится в следующем блоке.


  3. Код может получить доступ a, но не q, потому что q не объявлен в блоке или любом из блоков (или паре других вещей), содержащих его.


При определении того, что такое неквалифицированный идентификатор (например, a или q выше, в отличие от foo in this.foo или toLowerCase in q.toLowerCase, которые являются квалифицированными), компилятор Java будет просматривать каждое из этих мест, одно за другим, пока не найдет соответствие:


  • Для переменной с таким именем в самом внутреннем блоке

  • Для переменной с таким именем в следующем блоке и так далее

  • Для поля2 или метода (обычно: члена) с таким именем в текущем классе

  • Для класса с таким именем из импортированного пакета

  • Для пакета с таким именем

В этом списке есть несколько других (я не собираюсь вдаваться в статический импорт с новичком).

Scope - это гораздо больше, я предлагаю изучить несколько руководств и / или начальную книгу по Java, чтобы узнать больше.


1 "локальная переменная" против "переменной" - В спецификации языка Java слово "переменная" используется в более общем смысле, чем это делает большинство людей в обычной речи. Когда я говорю "переменная" в этом ответе, я имею в виду то, что JLS называет "локальной переменной".

2 "поле" - JLS называет поля "переменными" в некоторых местах (и "полями" в других местах), следовательно (1) выше. :-)

Ответ 2

From Section 6.3 of the Java Language Specification:


The scope of a declaration is the region of the program within which the entity declared by the declaration can be referred to using a simple name, provided it is visible.


This concept of scope applies to many kinds of entities in Java: everything from local variables to top-level classes and packages. Even when just talking about variables, there are many cases, from local variables to statically imported fields from another class to the parameter of an exception handler in a catch clause of a try statement. For details, read the JLS or search the web for "Java scope" and read one or more of the many tutorials on the subject that show up.

java