JavaRush /Курсы /JAVA 25 SELF /Модификаторы доступа, область видимости переменных

Модификаторы доступа, область видимости переменных

JAVA 25 SELF
8 уровень , 5 лекция
Открыта

1. Введение

В Java, как и в жизни, не всё должно быть доступно всем и всегда. Представьте себе квартиру: вы не хотите, чтобы соседи ходили по вашей спальне, правда? Вот и в программах мы иногда хотим “закрыть дверь” к каким-то переменным или методам, чтобы к ним нельзя было обратиться снаружи.

Для этого в Java есть модификаторы доступа — специальные слова, которые указывают, где можно использовать ту или иную переменную или метод: например, public или private.

Основные модификаторы доступа

Модификатор Где видно?
public
Везде, где виден класс (и в других пакетах, и в других файлах)
private
Только внутри того же класса
(без модификатора)
Только внутри того же пакета (т.е. внутри классов в той же директории)

Существуют ещё модификаторы, но о них мы поговорим позже, когда доберёмся до наследования.

Пример на практике

public class User 
{
    public String name;           // видно всем
    private int age;              // видно только внутри класса User

    public void sayHello() 
    {
        System.out.println("Привет, меня зовут " + name);
    }

    private void secretMethod() 
    {
        System.out.println("Это секретный метод!");
    }
}

Пояснение:

  • name — видно везде, где можно использовать класс User.
  • age — видно только внутри самого класса User.
  • sayHello() — публичный метод, его можно вызвать из любого другого класса.
  • secretMethod() — приватный метод, его нельзя вызвать снаружи.

Как это работает в реальных задачах?
Допустим, у нас есть класс, описывающий банковский счёт. Мы явно не хотим, чтобы кто угодно мог менять баланс напрямую! Поэтому переменная баланса будет private, а для работы с ней будут специальные методы.

Почему не стоит делать всё public?

Может возникнуть соблазн: «А давайте всё сделаем public, чтобы не мучиться!» Но это путь к хаосу. Представьте, что кто угодно может менять ваш баланс, имя пользователя или даже вызвать метод, который должен был быть только для внутреннего использования. В больших программах это приводит к ошибкам и «магическим» багам.

Золотое правило Java-разработчика:
Сначала делайте всё private, а потом открывайте наружу только то, что действительно нужно.

2. Область видимости переменных

Область видимости — это зона кода, где переменная «существует» и может быть использована. Если выйти за эту зону, переменная «пропадает» — как будто её и не было.

В Java есть несколько видов переменных по области видимости:

  • Локальные переменные — объявлены внутри метода или блока кода { ... }.
  • Параметры метода — объявлены в круглых скобках метода.
  • Поля класса — объявлены внутри класса, но вне методов.

Если переменная объявлена внутри { блока },
она видна только внутри этого блока
и недоступна вне его.
Область видимости локальной переменной

Локальные переменные

Локальная переменная живёт только внутри метода или блока, в котором объявлена.

void printSum(int a, int b) 
{
    int sum = a + b; // локальная переменная
    System.out.println(sum);
}
// sum тут уже не существует!

Попытка обратиться к sum вне метода вызовет ошибку компиляции: «Не могу найти переменную sum».

Параметры метода

Параметры — это тоже переменные, но они живут только внутри метода.

void greet(String name) 
{
    System.out.println("Привет, " + name);
}
// name тут уже не существует!

Поля класса (переменные-члены)

Поля класса объявляются внутри класса, но вне методов. Они видны во всех методах этого класса.

public class Counter 
{
    private int count = 0; // поле класса

    public void increment() 
    {
        count++; // можем использовать поле
    }

    public int getCount() 
    {
        return count; // тоже можем использовать поле
    }
}

3. Затенение переменных (Shadowing)

Затенение (shadowing) — это ситуация, когда в одной области видимости объявляется переменная (или параметр) с тем же именем, что и во внешней области. Внутри этого блока «новое» имя затеняет старое, и к внешнему значению уже нельзя обратиться напрямую.

Пример затенения:

class ShadowDemo 
{
    int value = 10; // поле класса

    void printValue() 
    {
        System.out.println(value);  // 10 — выводит поле класса
        int value = 5; // локальная переменная затеняет поле класса
        System.out.println(value); // выводит 5, а не 10
    }
}

В этом примере, когда мы пишем int value = 5;, мы объявляем новую локальную переменную, которая имеет приоритет над полем класса с тем же именем. При обращении к value внутри метода printValue(), будет использоваться локальная переменная, а не поле класса.

Если всё-таки нужно обратиться к статическому полю класса, то используйте имя класса как префикс:

class ShadowDemo 
{
    static int value = 10; // статическое поле класса 

    void printValue() 
    {
        System.out.println(value);      // 10 — поле класса
        int value = 5;
        System.out.println(value);      // 5 — локальная переменная
        System.out.println(ShadowDemo.value); // 10 — статическое поле класса, доступ через 'ShadowDemo'
    }
}

Если нужно обратиться к нестатическому полю класса, используется ключевое слово this. Оно указывает на текущий экземпляр объекта.

class ShadowDemo 
{
    int value = 10;

    void printValue() 
    {
        System.out.println(value);      // 10 — поле класса
        int value = 5;
        System.out.println(value);      // 5 — локальная переменная
        System.out.println(this.value); // 10 — поле класса, доступ через 'this'
    }
}

4. Практика: модификаторы доступа и область видимости

Давайте продолжим развивать учебное приложение: простая система учёта студентов. Сделаем поля и методы с разными модификаторами доступа.

Пример: класс Student

public class Student 
{
    public String name;        // имя студента (видно всем)
    private int age;           // возраст (видно только внутри класса)

    public Student(String name, int age) 
    {
        this.name = name;
        this.age = age;
    }

    public void sayHello() 
    {
        System.out.println("Привет, меня зовут " + name);
    }

    private void printSecret() 
    {
        System.out.println("Мой возраст: " + age);
    }

    public void revealSecret() 
    {
        printSecret(); // можно вызвать приватный метод внутри класса
    }
}

Использование класса Student

public class Main 
{
    public static void main(String[] args) 
    {
        Student s = new Student("Вася", 20);
        s.sayHello();       // ОК: публичный метод
        s.revealSecret();   // ОК: публичный метод, который вызывает приватный внутри

        s.age = 30;      // Ошибка! Поле age приватное

        s.printSecret(); // Ошибка! Метод printSecret приватный
    }
}

5. Типичные ошибки при работе с модификаторами доступа и областью видимости

Ошибка №1: Всё public — и здравствуй, хаос!
Если сделать все поля и методы публичными, вы рискуете потерять контроль над тем, кто и как меняет ваши данные. Делайте поля private и открывайте наружу только необходимое.

Ошибка №2: Попытка использовать переменную вне её области видимости.
Например, объявили переменную внутри метода, а потом пытаетесь обратиться к ней снаружи — получите ошибку компиляции. Локальные переменные живут только в своём блоке { ... }.

Ошибка №3: Конфликт имён (затенение переменных).
Если в методе объявить переменную с тем же именем, что и поле класса, легко запутаться, какую переменную вы используете. Используйте this, чтобы явно указывать на поле класса: this.value.

Ошибка №4: Попытка обратиться к private-методу или полю из другого класса.
Если метод или поле помечены как private, они доступны только внутри того же класса. Попытка обратиться к ним снаружи вызовет ошибку компиляции.

Ошибка №5: Забыли про область видимости в цикле или блоке.
Переменная, объявленная внутри цикла или любого блока { }, живёт только внутри этого блока. Вне блока она не существует.

1
Задача
JAVA 25 SELF, 8 уровень, 5 лекция
Недоступна
Открытый реестр жителей деревни 🏡
Открытый реестр жителей деревни 🏡
1
Задача
JAVA 25 SELF, 8 уровень, 5 лекция
Недоступна
Сверхсекретный банковский счет клиента 🔒
Сверхсекретный банковский счет клиента 🔒
1
Задача
JAVA 25 SELF, 8 уровень, 5 лекция
Недоступна
Настройка размера производственной коробки 📦
Настройка размера производственной коробки 📦
1
Задача
JAVA 25 SELF, 8 уровень, 5 лекция
Недоступна
Управление информацией о школьниках в базе данных 👩‍🎓
Управление информацией о школьниках в базе данных 👩‍🎓
1
Опрос
Методы, 8 уровень, 5 лекция
Недоступен
Методы
Объявление и вызов методов
Комментарии (12)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anonymous #3628287 Уровень 1
17 марта 2026
Ура!!! Много задач!!
Олег Уровень 36
18 февраля 2026
Думал, сопромат это худшее из зол.
Ilya Pozdnyakov Уровень 13
14 февраля 2026
Дай б-г мне терпения и ума все это переварить и понять...
Ernur Adilbek Уровень 25
23 декабря 2025
добрый день всем, Подскажите пожалуйста что это такое, выглядит как метод но одно название с классом и еще ничего не возвращает и воида нет перед ним public Student(String name, int age) { this.name = name; this.age = age; }
Johnny Уровень 12
2 января 2026
Это конструктор. Это будет разобрано далее в курсе. Пока что игнорируйте
САН САНЫЧ Уровень 20
14 декабря 2025
этот курс нравиться больше все объясняется доходчивей
Kismet Уровень 23
10 декабря 2025
Понятно, но непонятно
Роман Соловьев Уровень 1
18 ноября 2025
Конструктор на пол шишечки показали)
C0N5P1RACY Уровень 42
9 ноября 2025
Я уже перестал что либо понимать еще две лекции назад. Привет челику что на первых лекциях писал что ему тяжело.
25 ноября 2025
привет, я добрался до этой точки
C0N5P1RACY Уровень 42
26 ноября 2025
Поздравляю! Но я перешел на старый, классический курс :) Мне лично он понравился больше, чем этот, хоть и приходится с первого уровня подниматься обратно :) Да и объясняется все как то проще P.S. На этом курсе я дошел до 12 уровня
Grrbrr7 Уровень 46
24 октября 2025
Помнится в старом курсе Java задача с this. была чуть ли ни одной из первых. Пердак подрывала знатно. В этом курсе уже по-другому подаётся, без подрывов.