В этой истории мы узнаем об инкапсуляции и сокрытии данных в Java на примерах.
Инкапсуляция — одна из ключевых особенностей объектно-ориентированного программирования. Инкапсуляция относится к объединению полей и методов внутри одного класса.
Он предотвращает доступ внешних классов к полям и методам класса и их изменение. Это также помогает добиться скрытия данных.
class Area { // fields to calculate area int length; int breadth; // constructor to initialize values Area(int length, int breadth) { this.length = length; this.breadth = breadth; } // method to calculate area public void getArea() { int area = length * breadth; System.out.println("Area: " + area); } } class Main { public static void main(String[] args) { // create object of Area // pass value of length and breadth Area rectangle = new Area(5, 6); rectangle.getArea(); } }
Выводы
Area: 30
В приведенном выше примере мы создали класс с именем Area. Основной целью этого класса является вычисление площади.
Для вычисления площади нам нужны две переменные: длина и ширина и метод: getArea()
. Следовательно, мы объединили эти поля и методы внутри одного класса.
Здесь к полям и методам можно получить доступ и из других классов. Следовательно, это не сокрытие данных.
Это всего лишь инкапсуляция. Мы просто храним похожие коды вместе.
Примечание. Люди часто считают инкапсуляцию сокрытием данных, но это не совсем так. Инкапсуляция относится к объединению связанных полей и методов вместе. Это можно использовать для скрытия данных. Инкапсуляция сама по себе не является сокрытием данных.
Почему инкапсуляция?
- В Java инкапсуляция помогает нам хранить связанные поля и методы вместе, что делает наш код чище и легче для чтения.
- Это помогает контролировать значения наших полей данных. Например:
class Person { private int age; public void setAge(int age) { if (age >= 0) { this.age = age; } } }
- Здесь мы создаем переменную age
private
и применяем логику внутри методаsetAge()
. Возраст не может быть отрицательным. - Методы получения и установки обеспечивают доступ только для чтения или только для записи к полям нашего класса. Например:
getName() // provides read-only access setName() // provides write-only access
- Это помогает разделить компоненты системы. Например, мы можем инкапсулировать код в несколько пакетов.
- Эти несвязанные компоненты (комплекты) можно разрабатывать, тестировать и отлаживать независимо друг от друга и одновременно. При этом любые изменения в одном компоненте никак не влияют на другие компоненты.
- Мы также можем добиться сокрытия данных с помощью инкапсуляции. В приведенном выше примере, если мы изменим переменную длины и ширины на частную, доступ к этим полям будет ограничен.
- И они скрыты от внешних классов. Это называется скрытием данных.
Скрытие данных
Скрытие данных — это способ ограничения доступа к нашим элементам данных путем сокрытия деталей реализации. Инкапсуляция также позволяет скрывать данные. Мы можем использовать модификаторы доступа для скрытия данных. Например:
class Person { // private field private int age; // getter method public int getAge() { return age; } // setter method public void setAge(int age) { this.age = age; } } class Main { public static void main(String[] args) { // create an object of Person Person p1 = new Person(); // change age using setter p1.setAge(24); // access age using getter System.out.println("My age is " + p1.getAge()); } }
Вывод
My age is 24
В приведенном выше примере у нас есть поле age private
. Поскольку это private
, к нему нельзя получить доступ извне класса.
Чтобы получить доступ к возрасту, мы использовали public
методы: getAge()
и setAge()
. Эти методы называются методами получения и установки.
Сделав возраст закрытым, мы смогли ограничить несанкционированный доступ за пределами класса. Это скрытие данных.
Если мы попытаемся получить доступ к полю age из класса Main, то получим ошибку.
// error: age has private access in Person p1.age = 24;