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

Тренажер по Java для пользователей с начальным уровнем подготовки.

Тренажер по Java

Тема урока: Область видимости переменных (Scope). В Java каждая переменная живет только внутри того блока кода { ... }, в котором она была объявлена. Это может быть метод, цикл, условие или весь класс.

  • Локальные переменные: создаются внутри метода и недоступны снаружи.
  • Поля класса: доступны всем методам этого класса.
  • Shadowing (затенение): когда локальная переменная имеет то же имя, что и поле класса.

Понимание Scope критически важно для написания безопасного кода без ошибок компиляции. Наши примеры и тесты помогут вам научиться определять, где переменная «видима», а где — нет.

Список тем

1. Доступные переменные

id: 40439_scope_vis_01_click

Перед вами фрагмент кода на Java с методом, в котором есть несколько вложенных блоков и цикл. Самая глубокая точка вложенности — строка с вызовом System.out.println(...) внутри цикла for. Ваша задача — найти и выделить в коде все имена переменных (включая поле класса, параметры метода и локальные переменные), которые на момент выполнения этой строки находятся в области видимости и могут быть использованы по имени. Не выделяйте имена классов, типов, методов и переменные, объявленные только после этой строки.

Кликните по всем фрагментам, которые подходят под условие задания.
public class {{UserService~|~t1}} {
    private String {{serviceName~|~t2}} = "UserService";

    public void {{process~|~t3}}(String {{userName~|~t4}}, int {{userAge~|~t5}}) {
        int {{minAge~|~t6}} = 18;
        boolean {{isAdult~|~t7}} = userAge >= minAge;

        if (isAdult) {
            String {{status~|~t8}} = "allowed";

            for (int {{i~|~t9}} = 0; i < 3; i++) {
                System.out.println(serviceName + " - " + userName + ", age: " + userAge
                        + ", status: " + status + ", attempt: " + i);
            }
        }

        String {{logPrefix~|~t10}} = "LOG:";
    }
}
Сообщения
Проверить
Показать подсказку

2. Ошибка компиляции

id: 40439_scope_out_02_predict

Проанализируйте фрагмент Java-кода про область видимости переменных. Внутри блока if объявляется локальная переменная, а затем программа пытается использовать её после закрывающей фигурной скобки if. Выберите вариант, который лучше всего описывает результат: будет ли вывод в консоль или возникнет ошибка (и на каком этапе).

Выберите правильный вариант ответа
class Main {
    public static void main(String[] args) {
        int x = 5;

        if (x > 0) {
            int y = 10;
            x = x + y;
        }

        System.out.println(y);
    }
}
Сообщения
Проверить
Показать подсказку

3. Решение конфликта имен

id: 40439_scope_shadow_03_replace

Ниже приведён класс на Java, где у объекта есть поле, а у метода — параметр с таким же именем. Из‑за этого параметр «затеняет» (shadowing) поле внутри метода. Заполните пропуск так, чтобы в присваивании изменялось именно поле объекта, а не параметр метода, и код корректно компилировался.

Заполните пропуски
class Counter {
    private int value;

    void setValue(int value) {
        input1S.value = value;
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Типы областей видимости

id: 40439_scope_block_04_sort

Перед вами список фрагментов Java-кода с объявлениями переменных. Разнесите каждый фрагмент по одной из двух категорий: «Поле класса» (объявлено на уровне класса, вне методов) и «Локальная переменная» (объявлена внутри метода или внутри блока, например if/for). Каждый элемент должен оказаться ровно в одной категории.

Перетяните элементы в соответствующие блоки
Поле класса
Локальная переменная
private int count;
static String APP_NAME = "ScopeDemo";
int total = 0;
boolean active = true;
for (int i = 0; i < 3; i++)
final double PI = 3.14159;
String message;
public long createdAt;
Сообщения
Проверить
Показать подсказку

5. Исправление видимости

id: 40439_scope_fix_05_error

В этом фрагменте Java-кода допущена ошибка, связанная с областью видимости: переменная объявлена внутри заголовка цикла for, а затем используется после завершения цикла. Из-за этого код не будет компилироваться. Исправьте строку(и) так, чтобы переменная была доступна там, где она используется, и программа корректно выводила итоговое значение.

Найдите ошибку и исправьте
class Main {
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 0; i < 3; i++) {
            sum += i;
        }
        System.out.println(i);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Правильная структура блоков

id: 40439_scope_move_06_build

Из предложенных строк соберите корректный Java-метод с вложенным блоком if так, чтобы переменная была объявлена до использования во вложенном блоке. В решении должна получиться рабочая структура метода с правильной вложенностью фигурных скобок. Среди строк есть лишние: их добавлять в итоговую последовательность не нужно.

Перетяните в правильном порядке строки из одного блока в другой
static void check(int x) {
    if (x > 0) {
        int doubled = x * 2;
        if (doubled > 3) {
            System.out.println(doubled);
        }
    }
}
        System.out.println(doubled);
    int doubled = x * 2;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

7. Значение затененной переменной

id: 40439_scope_val_07_give

Проанализируйте Java-код и введите одно число, которое будет выведено в консоль. Обратите внимание на область видимости и затенение (shadowing): в классе есть поле с одним именем, а внутри метода объявляется локальная переменная с таким же именем. Нужно понять, какое значение будет использовано при выводе.

Что должно получиться?
public class Main {
    static int x = 10;

    static void show() {
        int x = 5;
        System.out.println(x);
    }

    public static void main(String[] args) {
        show();
    }
}
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру