Тема урока: Область видимости переменных (Scope). В Java каждая переменная живет только внутри того блока кода { ... }, в котором она была объявлена. Это может быть метод, цикл, условие или весь класс.
- Локальные переменные: создаются внутри метода и недоступны снаружи.
- Поля класса: доступны всем методам этого класса.
- Shadowing (затенение): когда локальная переменная имеет то же имя, что и поле класса.
Понимание Scope критически важно для написания безопасного кода без ошибок компиляции. Наши примеры и тесты помогут вам научиться определять, где переменная «видима», а где — нет.
- Модуль 1: Первая программа и структура
- Модуль 2: Переменные и типы данных
- Объявление и инициализация переменных.
- Примитивы: целые числа (int, long, byte, short).
- Примитивы: дробные числа (double, float).
- Примитивы: логический тип (boolean).
- Примитивы: символьный тип (char).
- String — основы работы со строками.
- Приведение типов (Casting): расширение и сужение.
- Область видимости переменных (Scope).
- Модуль 3: Операторы
- Модуль 4: Управляющие конструкции
- Модуль 5: Массивы и Строки (Advanced)
- Создание и заполнение массива.
- Доступ к элементам по индексу.
- Свойство length и перебор массива.
- Цикл for-each для массивов.
- Многомерные массивы.
- Методы String: length, charAt, isEmpty.
- Манипуляции: substring, concat, replace.
- Сравнение строк: equals vs ==.
- Разделение строк (split) и trim.
- StringBuilder (изменяемые строки).
- Модуль 6: Методы
- Модуль 7: Классы и Объекты (ООП Часть 1)
- Модуль 8: Капсуляция и Модификаторы
- Модуль 9: Наследование и Полиморфизм (ООП Часть 2)
- Модуль 10: Обработка исключений
- Модуль 11: Коллекции и Дженерики
- Модуль 12: Функциональный стиль (Java 8+)
- Модуль 13: Полезные стандарты
1. Доступные переменные
Перед вами фрагмент кода на 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. Ошибка компиляции
Проанализируйте фрагмент 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. Решение конфликта имен
Ниже приведён класс на Java, где у объекта есть поле, а у метода — параметр с таким же именем. Из‑за этого параметр «затеняет» (shadowing) поле внутри метода. Заполните пропуск так, чтобы в присваивании изменялось именно поле объекта, а не параметр метода, и код корректно компилировался.
class Counter {
private int value;
void setValue(int value) {
input1S.value = value;
}
}
4. Типы областей видимости
Перед вами список фрагментов 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. Исправление видимости
В этом фрагменте 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); }}6. Правильная структура блоков
Из предложенных строк соберите корректный 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;7. Значение затененной переменной
Проанализируйте 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();
}
}