Что такое «область видимости» в Java?

#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) выше:

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

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

  3. Код может получить доступ 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» и прочитайте одно или несколько из множества учебных пособий по этой теме, которые появляются.