Инкапсуляция
Инкапсуляция - это принцип объектно-ориентированного программирования, который заключается в скрытии деталей реализации от внешнего мира и предоставлении интерфейса для взаимодействия с объектом.
- что всё это значит и для чего этого вообще нужуно?
Ответ на этот вопрос хорошо ответит картинка ниже.

Пожалуй это лучшая иллюстрация понятия инкапсуляции. Данный объект часы нужен для получения текущего времени, время на часах можно настроить несколькими способами.
- Открыть крышку часов и покрутить шестерёнки (это может привести к поломке).
- Использовать специальный винт (безопасно).
Если вдуматься мы пользуемся многими вещами не вникая в то, как именно эти вещи работают.
В данном примере часы. Нам не важно как именно они работают, нам важен факт того, что мы можем получить информацию о текущем времени. Для получения времени мы смотрим на дисплей, для изменения времени мы крутим винт.
Возьмём другой пример "электрочайник", это устройство позволяет изменить температуру воды. Опять же, нам не важно как, нам важно, что вода была холодной, а стала горячей. Для изменения температуры воды мы нажимаем кнопку, хотя могли бы разобрать чайник и замкнуть контакты нагревателя напрямую, но в этом случае есть вероятность получить удар током.
В программировании всё точно так-же. У объектов имеются поля, к некоторым из этих полей нужно закрыть доступ, чтобы напрямую нельзя было менять значение. Как это сделать? Давайте разбираться - это просто!
В файле Person.java
Мы добавили свойство hp перед которым указано ключевое слово private.
Добавив модификатор private мы запретили обращаться к этому полу вне класса.
В файле Main.java
Как видно из примера, при запуске программы, мы получаем ошибку java: hp has private access in Person, переводя на русский java: hp имеет приватный доступ у Person.
Как же теперь получить доступ к этому полю? Ну раз нам нельзя использовать вне класса, а внутри класса можно, то, почему бы не написать метод позволяющий получать значение этого метода.
В файле Person.java
В файле Main.java
Отлично, получить значение переменной мы сумели, а вот менять её значение не можем, всё по той же причине, она приватная.
И вот самый важный момент, если мы хоим, чтобы изменение переменной происходило в некоторых пределах, то мы можем написать алгоритм по которому будет меняться значение. Смотрим пример:
В файле Person.java
В файле Main.java
Обратите внимание, теперь мы не можем назначить произвольное значение переменной hp.
Переменная hp теперь может меняться только в пределах от 0 до 100.
Резюме:
Если перед полем или методом указан модификатор private, то получить доступ можно только внутри класса.
Если перед полем или методом указан модификатор public, то получить доступ можно можно из любого класса.
Имеется ещё два модификатора доступа default и protected - о них мы узнаем позже.
Геттеры и сеттеры
Давайте внимательно посмотрим как я назвал методы для обращения к полю hp.
getHp() - get+НазваниеПоля - для получения значения
setHp() - set+НазваниеПоля - для изменения значения
Метод для получения значения называется геттер, начинается обязательно со слова get или is для boolean, затем пишется название поля с большой буквы.
Метод для изменения значения называется сеттер, начинается обязательно со слова set, затем пишется название поля с большой буквы.
Использование инкапсуляции, геттеров и сеттеров позволяет сохранить целостность данных и управлять доступом к ним, что способствует безопасности и гибкости кода. Правильное использование этих концепций позволяет создавать надежные и гибкие объектно-ориентированные программы.