#java #server #serversocket
#java
Вопрос:
Я только начал кодировать. Я хочу использовать оператор switch дважды для одной и той же переменной, и мне сказали, что для этого переменная должна быть «в области видимости».
Будучи новичком, я понятия не имею, что это значит. Итак, что означает быть в области видимости? И, если переменная не находится в области видимости, как мне сделать это в области видимости?
Комментарии:
1. Пожалуйста, взгляните сюда
2. Короче говоря: область видимости переменной определяет раздел кода, в котором видна переменная. В общем случае переменные, определенные внутри блока, недоступны за пределами этого блока. Вы можете узнать, что это значит, просмотрев ссылки, размещенные выше, это не так уж сложно.
Ответ №1:
Локальная переменная 1 находится «в области видимости», если код может получить к ней доступ, и вне области видимости, если не может. В Java переменные ограничены областью действия block ( {}
), в которой они объявлены. Итак:
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) выше:
-
Код может получить доступ
q
, потомуq
что объявлен в том же блоке, что и код; tt может получить доступa
, потому что он объявлен в содержащем блоке. -
Код может получить доступ
q
, потому что он объявлен в содержащем блоке; он может получить доступa
, потому что он находится в следующем блоке. -
Код может получить доступ
a
, но нетq
, потомуq
что не объявлен в блоке или любом из блоков (или нескольких других вещей), содержащих его.
При определении того, что такое неквалифицированный идентификатор (например a
, или q
выше, в отличие от foo
in this.foo
или toLowerCase
in q.toLowerCase
, которые являются квалифицированными), компилятор Java будет искать в каждом из этих мест, одно за другим, пока не найдет совпадение:
- Для переменной с таким именем в самом внутреннем блоке
- Для переменной с таким именем в следующем блоке и так далее
- Для поля 2 или метода (обычно: члена) с таким именем в текущем классе
- Для класса с таким именем из импортированного пакета
- Для пакета с таким именем
Для этого списка есть несколько других (я не собираюсь вдаваться в статический импорт с новичком).
В области видимости есть гораздо больше, я предлагаю поработать с некоторыми учебными пособиями и / или книгой beginning Java для получения дополнительной информации.
1 «локальная переменная» против «переменной» — спецификация языка Java использует «переменную» в более общем смысле, чем это делает большинство людей в обычной речи. Когда я говорю «переменная» в этом ответе, я имею в виду то, что JLS называет «локальной переменной».
2 «поле» — JLS называет поля «переменными» в некоторых местах (и «поля» в других местах), следовательно (1) выше. 🙂
Комментарии:
1. Я не думаю, что область видимости и доступность — это одно и то же. Ключом к «области видимости» является то, что на переменную можно ссылаться по неквалифицированному имени. Таким образом, общедоступная статическая переменная
a
в общедоступном классеA
может быть доступна из кода в классеB
(то есть в отдельном модуле компиляции)A.a
, ноa
не находится в области видимости в классеB
, если она статически не импортирована вB
модуль компиляции.2. @TedHopp: для переменных существует эквивалентность, о чем в основном говорится в приведенном выше ответе. Я уточню список в конце, я действительно говорил о неквалифицированных идентификаторах.
3. Я не думаю, что вы используете термин переменная в соответствии с JLS. Например, в разделе 4.12.3 определены восемь типов переменных, включая переменные класса и экземпляра (
static
также известные как поля и неstatic
поля соответственно). Нет эквивалентности между областью видимости и доступом, когда речь идет о таких переменных. Но я согласен, что OP, вероятно, говорит о локальных переменных, и в этом случае существует эквивалентность.4. @TedHopp: Я склонен забывать, что JLS использует «переменную» там, где большинство из нас использует «поле», спасибо. (Мне тоже только что напомнили об этом на днях!) Я обновлю приведенное выше, чтобы указать локальную переменную .
Ответ №2:
Из раздела 6.3 спецификации языка Java:
Область видимости объявления — это область программы, в которой объект, объявленный объявлением, может быть передан с использованием простого имени, при условии, что он виден.
Эта концепция области видимости применима ко многим видам сущностей в Java: от локальных переменных до классов и пакетов верхнего уровня. Даже когда речь идет просто о переменных, существует множество случаев, от локальных переменных до статически импортируемых полей из другого класса до параметра обработчика исключений в catch
предложении try
инструкции. Для получения подробной информации ознакомьтесь с JLS или найдите в Интернете «Область видимости Java» и прочитайте одно или несколько из множества учебных пособий по этой теме, которые появляются.