English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве вы узнаете о энкапсуляции и скрытии данных в Java с помощью примеров.
Энкапсуляция - одна из важнейших функций объектно-ориентированного программирования. Энкапсуляция - это привязка полей и методов к одному классу.
Связывание аналогичных полей и методов в классе также помогает скрывать данные.
Обычно, энкапсуляция - это процесс 包装 аналогичного кода в одном месте.
В Java мы можем связывать вместе поля и методы, которые работают в одном классе. Например:
class Rectangle { int length; int breadth; public void getArea() {} }
В上面的 программе метод getArea() вычисляет площадь прямоугольника. Для вычисления площади он нуждается в длине (length) и ширине. Поэтому данные поля length, breadth и метод getArea() поместили в класс Rectangle.
Скрытие данных - это метод ограничения доступа к членам данных, достигаемый скрытием реализации деталей.
Энкапсуляция также предоставляет метод для скрытия данных.
Скрытие данных можно реализовать с помощью修饰ателей доступа. В Java есть четыре修饰ателя доступа:
public - Присвоенные атрибуты или методы являются общедоступными и могут быть доступны везде, по умолчанию все атрибуты и методы являются public
private - Присвоенные атрибуты или методы являются частными и не могут быть доступными вне класса, в котором они были объявлены
protected - Свойства или методы,修饰анные этим, являются защищенными. Они类似 к private, но различаются тем, что в подклассах к ним также можно получить доступ.
default - Не требует никаких修饰ателей доступа, обычно称为 "модели доступа по умолчанию". В этом режиме доступ разрешен только в рамках одной пакеты.
Для получения дополнительной информации посетитеМодификаторы Java.
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 в частное, чтобы ограничить доступ из вне класса без разрешения. Это скрытие данных.
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() // предоставление только чтения доступа
Это помогает дез耦чить компоненты системы. Эти дез耦ченные компоненты могут разрабатываться, тестироваться и отладляться независимо и одновременно. И любое изменение в одном компоненте не будет влиять на другие компоненты.
Чаще всего считается, что обертка - это скрытие данных, но это не совсем правильно.
Обертка означает捆绑 связанных полей и методов.Это позволяет нам реализовать скрытие данных.Обертка本身 не является скрытием данных.