Инкапсуляция и модификаторы доступа в Java

Инкапсуляция в Java: модификаторы доступа private и public, скрытие полей и доступ к ним через геттеры и сеттеры.

Инкапсуляция — это сокрытие внутренних данных объекта и предоставление к ним контролируемого доступа. Объект сам решает, как с ним можно работать.

Модификаторы доступа

Модификатор перед полем или методом определяет, откуда к нему можно обращаться:

Модификатор

Доступ

public

отовсюду

private

только внутри своего класса

protected

внутри класса и его наследников

(без модификатора)

внутри своего пакета

Проблема открытых полей

Если поле public, любой код может присвоить ему некорректное значение — и объект окажется в «сломанном» состоянии:

class Account {
    public int balance;
}

Account a = new Account();
a.balance = -1000;   // ничто не мешает сделать баланс отрицательным

Решение: private + геттеры и сеттеры

Поле делают private, а доступ дают через методы. Сеттер может проверять корректность данных, прежде чем менять поле.

class Account {
    private int balance;            // поле скрыто

    public int getBalance() {       // геттер — чтение
        return balance;
    }

    public void deposit(int amount) {
        if (amount > 0) {           // проверка перед изменением
            balance += amount;
        }
    }
}
Account a = new Account();
a.deposit(500);
a.deposit(-100);          // проигнорируется проверкой
System.out.println(a.getBalance());
// a.balance = -1000;     // ← ошибка компиляции: поле private

Вывод:

500

По соглашению геттеры называют getX(), сеттеры — setX(), а для логического поля геттер часто называют isX().

Зачем это нужно

  • Контроль: объект гарантирует, что его данные всегда корректны.
  • Гибкость: внутреннюю реализацию можно менять, не ломая внешний код.
  • Понятный интерфейс: видно, что с объектом можно делать, а что нет.

Коротко

  • Инкапсуляция = скрыть данные (private) + дать контролируемый доступ через методы.
  • public — отовсюду, private — только в своём классе.
  • Геттеры читают поле, сеттеры меняют его с проверкой корректности.
Проверьте себя
1. Какой модификатор делает поле доступным только внутри своего класса?
Apublic
Bprivate
Cprotected
Dopen
2. Зачем доступ к private-полю дают через сеттер, а не делают поле public?
AТак короче код
BСеттер может проверить корректность значения перед изменением
Cpublic-полей не существует
DЧтобы поле быстрее работало
3. Что описывает инкапсуляция?
AСоздание копий объектов
BСокрытие данных и контролируемый доступ к ним
CНаследование классов
DПеребор массива
Поддержать проект