В этой истории мы узнаем об инкапсуляции и сокрытии данных в 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;