Инкапсуляция и модификаторы доступа в Java
Инкапсуляция в Java: модификаторы доступа private и public, скрытие полей и доступ к ним через геттеры и сеттеры.
Инкапсуляция — это сокрытие внутренних данных объекта и предоставление к ним контролируемого доступа. Объект сам решает, как с ним можно работать.
Модификаторы доступа
Модификатор перед полем или методом определяет, откуда к нему можно обращаться:
Модификатор | Доступ |
| отовсюду |
| только внутри своего класса |
| внутри класса и его наследников |
(без модификатора) | внутри своего пакета |
Проблема открытых полей
Если поле 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Перебор массива