English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной учебник Java

Java Управление потоком

Java Массив

Java Ориентированное на объекты (I)

Java Ориентированное на объекты (II)

Java Ориентированное на объекты (III)

Обработка исключений Java

Java Список (List)

Java Queue (очередь)

Java Map коллекция

Java Set коллекция

Java Вход/Выход (I/O)

Java Reader/Writer

Другие темы Java

Энкapsulation Java

В этом руководстве вы узнаете о энкапсуляции и скрытии данных в Java с помощью примеров.

Энкapsulation Java

Энкапсуляция - одна из важнейших функций объектно-ориентированного программирования. Энкапсуляция - это привязка полей и методов к одному классу.

Связывание аналогичных полей и методов в классе также помогает скрывать данные.

Энкапсуляция полей и методов

Обычно, энкапсуляция - это процесс 包装 аналогичного кода в одном месте.

В Java мы можем связывать вместе поля и методы, которые работают в одном классе. Например:

class Rectangle {
   int length;
   int breadth;
   public void getArea() {}
}

В上面的 программе метод getArea() вычисляет площадь прямоугольника. Для вычисления площади он нуждается в длине (length) и ширине. Поэтому данные поля length, breadth и метод getArea() поместили в класс Rectangle.

Java скрытие данных

Скрытие данных - это метод ограничения доступа к членам данных, достигаемый скрытием реализации деталей.

Энкапсуляция также предоставляет метод для скрытия данных.

Скрытие данных можно реализовать с помощью修饰ателей доступа. В Java есть четыре修饰ателя доступа:

  • public - Присвоенные атрибуты или методы являются общедоступными и могут быть доступны везде, по умолчанию все атрибуты и методы являются public

  • private - Присвоенные атрибуты или методы являются частными и не могут быть доступными вне класса, в котором они были объявлены

  • protected - Свойства или методы,修饰анные этим, являются защищенными. Они类似 к private, но различаются тем, что в подклассах к ним также можно получить доступ.

  • default - Не требует никаких修饰ателей доступа, обычно称为 "модели доступа по умолчанию". В этом режиме доступ разрешен только в рамках одной пакеты.

Для получения дополнительной информации посетитеМодификаторы Java.

Пример 1: Использование частных данных для隐蔽ности

class Person {
   private int age;
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
}
class Main {
   public static void main(String[] args) {
      Person p1 = new Person();
      p1.setAge(24);
      System.out.println("Мой возраст составляет " + p1.getAge());
   }
}

Результат вывода

Мой возраст составляет 24

В предыдущем примере у нас есть частное поле age. Поскольку оно частное, к нему нельзя получить доступ извне. Чтобы получить доступ к age, мы используем общие методы getAge() и setAge(). Эти методы называются методами getter и setter.

Если попытаться получить доступ к полю age из класса Main, то会出现 ошибку.

p1.age = 24; // ошибка: age имеет частный доступ в Person

Установите age в частное, чтобы ограничить доступ из вне класса без разрешения. Это скрытие данных.

Пример 2: Использование защищенного данных для隐蔽ности

class Person {
 protected String profession;
 protected void displayInfo() {
   System.out.println("I am a " + profession);
 }
}
class Teacher extends Person {
   public static void main(String[] args) {
      Teacher t1 = new Teacher();
      t1.profession = "teacher";
      t1.displayInfo();
   }
}

Результат вывода

I am a teacher

В предыдущем примере мы создали класс Person, который содержит защищенные поля profession и защищенный метод displayInfo().

Мы уже получили доступ к этим членам из класса Teacher (дочерний класс Person).

Почему упаковка?

  • В Java упаковка помогает нам сохранять вместе связанные поля и методы, что делает наш код более упорядоченным и легким для чтения.

  • Это помогает контролировать изменения в наших данных полей. Рассмотрим ситуацию, когда мы хотим, чтобы поле age в классе было не âmым. Здесь мы можем сделать age частным и применить логику в методе setAge(). Например,

class Person {
   private int age;
   public void setAge(int age) {
     if (age >= 0) {
        this.age = age;
     }
   }
}
  • getter и setter методы предоставляют только чтение или только запись доступа к нашим классовым полям. Например:

getName()   // предоставление только чтения доступа
setName()   // предоставление только чтения доступа
  • Это помогает дез耦чить компоненты системы. Эти дез耦ченные компоненты могут разрабатываться, тестироваться и отладляться независимо и одновременно. И любое изменение в одном компоненте не будет влиять на другие компоненты.

Скрытие данных и обертка

Чаще всего считается, что обертка - это скрытие данных, но это не совсем правильно.

Обертка означает捆绑 связанных полей и методов.Это позволяет нам реализовать скрытие данных.Обертка本身 не является скрытием данных.