Загрузка...

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

Напишите метод с именем mark и одним параметром: static void mark(int n). Внутри фигурных скобок напечатайте этот параметр через System.out.println(n);. Из main вызовите mark(4);. Экран должен показать одну строку: 4. Имя n существует только внутри mark. Если попытаться напечатать n из main, javac откажет. Эта граница — какие имена видит метод — то, чему учит эта страница.

Имена, которые остаются внутри метода

На странице перегрузки несколько методов paint делили одно имя, но держали разные списки параметров. Здесь фокус меньше: один метод, одно имя параметра и где этому имени можно появиться. Параметр — имя, которое принадлежит методу, объявившему его. Вне фигурных скобок этого метода имени уже нет.
Создайте небольшой файл программы Gate.java. Строка public class в начале должна совпадать с именем файла: public class Gate. Не оставляйте старое имя класса Sign или Box в этом файле; компилятор ждёт совпадения имени класса и имени файла.
Вне main, но всё ещё внутри фигурных скобок класса, напишите static void mark(int n). В теле одна печать: System.out.println(n);. На этой странице оставьте void. Вы смотрите на видимость, а не на возвращаемые значения. Сохраните файл перед компиляцией. Полная первая программа — в следующем блоке.

Gate.java с mark

Это версия, которую вы компилируете первой. В main — вызов. В mark — печать, которая использует n.

mark prints its parameter

java
public class Gate {
    public static void main(String[] args) {
        mark(4);
    }

    static void mark(int n) {
        System.out.println(n);
    }
}

Из папки, где лежит Gate.java, выполните javac Gate.java. Когда скобки, фигурные скобки и точки с запятой совпадают, javac не пишет своей строки. Затем выполните java Gate — не java Gate.java. Уберите окончание .java во второй команде. Те же две команды работают в Windows и macOS. Программа должна напечатать одну строку и остановиться: 4. Она не должна ждать ввода. Если терминал ждёт клавиатуру, в файле ещё остался вызов nextLine из старого упражнения. Удалите его и оставьте mark(4); плюс метод mark выше.
Пройдите запуск один раз по порядку. Java начинает с main. Вызов mark(4) отправляет 4 в параметр n. Внутри mark выражение println(n) пишет 4. Когда mark заканчивается, имя n тоже заканчивается. У main никогда не было имени n. Число 4 прошло через вызов как значение. Имя n в main не переехало.
Если после вызова добавить в main строку System.out.println(n);, javac сообщит, что не находит символ n. Эта ошибка и есть урок: n никогда не объявляли в main. Исправьте, убрав эту строку из main, или объявите там другое имя, если нужен локальный. Не ждите, что параметр mark сам появится в main.

Локальное имя рядом с параметром

Внутри mark можно также объявить новое имя, которое не параметр. Это локальное имя живёт только между скобками mark. Измените тело так, чтобы хранить метку и печатать метку и n в одной строке, или оставьте второй короткий метод для демо — на этой странице следующий блок вместо этого показывает передачу имени из main, обычный путь новичка.
Частая надежда новичка — что имя, объявленное в main, автоматически видно в каждом методе класса. На этой форме это не так. Если в main есть int room = 4;, а mark пытается печатать room без получения, javac не находит room внутри mark. Решение — передать значение: mark(room); при объявлении mark(int n).

Передайте локальное из main в mark

Объявите int room = 4; внутри main. Вызовите mark(room);. Внутри mark продолжайте печатать n. Экран по-прежнему показывает 4. Локальное имя в main — room. Имя параметра в mark — n. Это разные имена в разных местах. Путешествует значение 4.

pass room into mark

java
public class Gate {
    public static void main(String[] args) {
        int room = 4;
        mark(room);
    }

    static void mark(int n) {
        System.out.println(n);
    }
}

Снова скомпилируйте и запустите: javac Gate.java, затем java Gate. Вы всё ещё видите одну строку: 4. Если изменить room на 9 и не трогать тело метода, экран покажет 9. Метод по-прежнему печатает то, что пришло в n. main может печатать и room, если добавить System.out.println(room); в main — это имя принадлежит туда. main по-прежнему не может печатать n.
Если mark объявляет своё локальное — например int tag = 1; внутри скобок — это tag невидимо для main. Попытка System.out.println(tag); в main падает по той же причине, что и печать n из main. Скобки mark — стена для имён, объявленных внутри.

Что защищает стена

Прочитайте разделение простыми словами. Имена, объявленные в main, остаются в main, пока вы не передадите их значения в вызов. Имена, объявленные в mark — параметры и локальные — остаются в mark. Вызов несёт значения, а не сами имена. Перегрузка с предыдущей страницы — другой навык: несколько методов с одним общим именем метода. Область видимости — про то, где имя переменной или параметра может появиться в исходнике.
Оставшееся демо Sign с несколькими методами paint может лежать в том же файле и путать экран, если main всё ещё вызывает paint("ok"). Очистите main до вызова mark, который вы проверяете. Не вкладывайте mark внутрь скобок main. Методы живут в классе рядом с main.
Запись System.out.println("n"); в main печатает букву n в кавычках. Она не печатает параметр. Оставляйте println(n) внутри mark, когда нужно значение, пришедшее через вызов. Запись mark(); с пустыми скобками падает, пока заголовок говорит mark(int n) — вызов должен отправить int, будь то литерал вроде 4 или локальное вроде room.

Перед recursion

Вы можете написать mark(int n), печатать n внутри этого метода и держать n вне main. Вы можете объявить room в main и передать room в mark. Экран показывает значение, прошедшее через вызов. Имена сами не протекают сквозь скобки. Следующая страница — recursion; там метод вызывает сам себя с меньшим аргументом, пока условие остановки не завершит цепочку.

🧠 Проверьте Свои Знания

Готов к Началу

Проверьте Свои Знания

Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему

❓
6
Вопросы
🎯
70%
Для Прохождения
♾️
∞
Время
🔄
∞
Попытки

📝 Инструкции

  • Внимательно прочитайте каждый вопрос
  • Выберите лучший ответ на каждый вопрос
  • Вы можете пересдавать тест столько раз, сколько захотите
  • Ваш прогресс будет показан вверху