Найти в Дзене

Java Введение. Инкапсуляция и модификаторы доступа. Часть 12.

Оглавление

У нас есть статья по ООП, эта же статья является более детальной частью про инкапсуляцию. Разберём что это, её особенности и применения.

Что такое инкапсуляция?

Инкапсуляция - это один из фундаментальных принципов объектно-ориентированного программирования, который позволяет объединить данные и методы их обработки в единый компонент (класс), скрыв детали реализации от пользователя.

Представьте, что вы купили набор мебели, в котором все предметы (стол, стулья, шкаф) упакованы в отдельные коробки и снабжены инструкцией по сборке. Вы не можете увидеть, как всё устроено внутри коробки, но следуя инструкции, вы можете собрать мебель.

Инкапсуляция в программировании похожа на этот процесс. Это механизм, который объединяет данные и методы, работающие с ними, в единый объект. Другими словами, это как если бы каждый предмет мебели был «чёрным ящиком» с инструкцией, и никто не может заглянуть внутрь, чтобы понять, как он устроен, но может следовать инструкции, чтобы использовать его.

Например, вы используете пульт дистанционного управления телевизором. Вы нажимаете кнопку, и телевизор реагирует определённым образом. Вы не знаете, как именно устроена эта реакция внутри телевизора, но можете пользоваться пультом, чтобы управлять им. Это и есть инкапсуляция — вы взаимодействуете с объектом (пультом), не зная всех деталей его внутреннего устройства.

Основные механизмы

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

  • private - доступен только внутри класса
  • default (без модификатора) - доступен в пределах пакета (в пределах одной папки)
  • protected - доступен в пределах пакета и подклассов (те классы которые унаследованы)
  • public - доступен везде (в подклассах, то есть можно наследоваться, в других папках)
-2

Геттеры и сеттеры:

  • Методы для получения и изменения значений полей
  • Позволяют контролировать доступ к данным

📗Public

Первый и основной модификатор доступа, с которым сталкивается каждый программист. Для того чтобы сообщить компилятору о необходимости сделать что-либо доступным для всех, применяется ключевое слово public.

После создания экземпляра этого класса можно получить доступ к любым его свойствам из любого места программы, где доступен сам объект (включая локальные и глобальные переменные).

Это удобно, так как позволяет в любой момент выполнять операции с объектом и его данными. Однако это также создаёт уязвимость: объект становится открытым для любых манипуляций. Например, можно просто изменить его стоимость.

-3
-4

Как мы видим данные доступны в другом классе.

Это может привести к проблемам:

1. Сложно отследить ошибки, так как не всегда понятно, где именно они возникают.

2. Если в программу попадёт чужой код, он сможет изменять и читать свойства любых объектов.

Конечно, это не лучший сценарий для приложения.

📗Protected

Переменная или метод, объявленный как protected, доступен в том же пакете и в подклассах, даже если они находятся в других пакетах.

Когда использовать protected?

Наследование — если нужно, чтобы подклассы могли использовать поля/методы, но они не должны быть публичными.
Инкапсуляция в пакетах — если логика должна быть доступна только внутри пакета и наследникам.
Не для публичного API — если элемент должен быть доступен всем, используйте public.
Не для строгой инкапсуляции — если элемент не должен быть доступен даже наследникам, используйте private.

Ограничения protected

🚫 Нельзя получить доступ из несвязанного класса (не наследника и не из того же пакета).
🚫
Нельзя использовать для классов (только для полей, методов и конструкторов).

📗Default

Модификатор доступа default (также называемый package-private) — это уровень доступа, который применяется, когда не указан ни один из модификаторов (public, protected, private).

Ключевые особенности:

  1. Видимость только внутри пакета — элементы с default доступом видны только классам из того же пакета.
  2. Недоступен вне пакета — даже если класс наследуется, default члены не будут видны в подклассах из других пакетов.
  3. Применяется к классам, полям, методам и конструкторам.

Когда использовать default доступ?

Логическая группировка классов — если несколько классов работают вместе внутри одного пакета, но не должны быть доступны извне.
Сокрытие внутренней реализации — например, вспомогательные методы, которые не нужны другим пакетам.
Не для публичного API — если функционал должен быть доступен другим пакетам, используйте public или protected.

📗Private

private — это самый строгий уровень инкапсуляции в Java. Он ограничивает видимость полей, методов и конструкторов только классом, в котором они объявлены.

Основные правила

  • private-элементы не видны в подклассах, других классах того же пакета или внешних пакетах.
  • Даже если класс наследуется, private поля/методы не передаются подклассам.
  • Применяется к полям класса, методам, конструкторам, вложенным классам.

Нельзя использовать для классов (кроме вложенных).

Что нельзя делать с private?

Обращаться из подкласса

-5

Доступ из другого класса того же пакета

-6

📗Статические методы vs Нестатические методы

  • Статические методы (с модификатором static) принадлежат классу, а не объекту. Их можно вызывать без создания объекта, например, ClassName.methodName().
  • Нестатические методы принадлежат объекту. Чтобы их вызвать, нужно сначала создать объект класса.

Это важная особенность ,важно помнить о ней, так как можно не создавать объект и использовать метод или переменную напрямую.

📗Модификатор final в Java

Ключевое слово final применяется для ограничения изменений в коде. В зависимости от контекста оно может использоваться с:

  • Переменными → запрещает изменение значения после инициализации.
  • Методами → запрещает переопределение в подклассах.
  • Классами → запрещает наследование.

Особенности:

  • Примитивы: значение нельзя изменить.
  • Объекты: ссылку нельзя изменить, но состояние объекта — можно.

Когда использовать final?

Константы: static final для значений, которые не должны меняться.
Аргументы методов: если нужно защитить параметры от изменения.
Классы и методы: для запрета расширения/переопределения.
Поля: для immutable-объектов (например, String).

Разница между static и final:

-7

Если есть желание поддержать меня - донат.

Если у вас есть вопросы или вы просто хотите стать частью команды тестировщиков, то переходи в ТГ канал, где можем пообщаться с единомышленниками и найти много интересных и полезных знаний!Также если вам нужна индивидуальная консультация, менторство и помощь в создании проекта пишите в ТГ канал!

Обучение тестированию