Область видимости
Область видимости (scope) — это где переменная “жива” и видна. Переменная существует только внутри своих фигурных скобок { } — снаружи о ней никто не знает:
void method() {
int x = 5; // x родилась здесь
if (x > 0) {
int y = 10; // y видна только внутри if
}
// здесь y уже не существует — вышла за свои { }
}
// здесь не существует и x — метод закончился
Представь область видимости как комнату: переменная — мебель в этой комнате. Выйди из комнаты — мебель не заберёшь с собой, она просто перестаёт быть доступной.
Копнуть глубже
Параметры метода живут во всём теле метода — это тоже своего рода переменные, просто их значение приходит снаружи при вызове.
Поля класса видны во всех методах класса (через this или просто по имени), а не только в одном блоке — их область видимости шире, она привязана к объекту, а не к фигурным скобкам одного метода.
Затенение (shadowing). Если локальная переменная называется так же, как поле класса, локальная “перекрывает” поле внутри своего блока:
class Counter {
int count = 0;
void reset() {
int count = 100; // затеняет поле count
this.count = 0; // this. — явно обращаемся к полю, а не к локальной
}
}
Под капотом
Локальные переменные живут на стеке — конкретно в кадре (frame) текущего вызова метода. Когда метод завершается, его кадр стека целиком уничтожается — вместе с ним исчезают и все локальные переменные. Поэтому область видимости — это не просто “правило компилятора для красоты”, а прямое отражение того, как устроена память: переменной физически негде быть после выхода из блока, кадр стека уже снят.
• что такое затенение и зачем нужен `this.` (если дошёл до 2-го слоя).